canuc80k2200·1/50

Mức Thấp Nhất

Nộp bài trên LQDOJ

Bài 22 · Sparse Table

Cho một dãy số nguyên không thay đổi trong suốt quá trình xử lý. Mỗi truy vấn xác định một đoạn chỉ số đóng . Với từng truy vấn, hãy tìm giá trị nhỏ nhất xuất hiện trong đoạn .

Input

  • Dòng đầu chứa hai số nguyên và - số phần tử của dãy và số truy vấn.
  • Dòng thứ hai chứa số nguyên .
  • Mỗi dòng trong dòng tiếp theo chứa hai số nguyên và , mô tả một truy vấn.

Output

  • Với mỗi truy vấn, in giá trị nhỏ nhất trên đoạn ở một dòng riêng.

Constraints

  • .
  • với mọi .
  • trong mọi truy vấn.
  • Mỗi truy vấn được thực hiện trên dãy ban đầu; không có thao tác cập nhật.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

7 4
8 3 6 2 7 2 5
1 3
2 6
4 4
5 7

Output

3
2
2
2

Giải thích: Giá trị nhỏ nhất của bốn đoạn lần lượt là và . Đặc biệt, truy vấn chỉ chứa một phần tử nên kết quả chính là .

Lời giải tóm tắt
  • Phân tích: Dãy không thay đổi và mỗi truy vấn chỉ yêu cầu minimum trên một đoạn. Ta tiền xử lý các đoạn có độ dài là lũy thừa của hai. Nhờ tính lũy đẳng của phép min, hai đoạn có thể chồng lên nhau mà vẫn cho đúng minimum của đoạn truy vấn.
  • Thuật toán: Gọi st[k][i] là giá trị nhỏ nhất của đoạn bắt đầu tại i và có độ dài 2^k. Ta có st[0][i]=a_i và st[k][i]=min(st[k-1][i], st[k-1][i+2^(k-1)]).
  • Thuật toán: Với truy vấn [l,r], đặt k=floor(log2(r-l+1)). Hai đoạn dài 2^k bắt đầu tại l và kết thúc tại r phủ toàn bộ [l,r]; đáp án là minimum của hai ô tương ứng.
  • Chứng minh: Quy nạp theo k cho thấy mỗi st[k][i] lưu đúng minimum trên đoạn của nó. Hai khối dùng khi trả lời truy vấn không bỏ sót vị trí nào trong [l,r]. Phần giao có thể được xét hai lần nhưng min(x,x)=x, nên minimum của hai khối chính là minimum của toàn đoạn.
  • Độ phức tạp: Tiền xử lý mất O(n log n) thời gian và bộ nhớ; mỗi truy vấn mất O(1) thời gian.