canuc80k2540·41/50

Màu Sắc Theo Thời Gian

Nộp bài trên LQDOJ

Bài 25 · Mo's Algorithm

Có một dãy gồm ô, mỗi ô mang một màu nguyên dương. Có thao tác được thực hiện theo thứ tự. Thao tác hỏi có bao nhiêu màu khác nhau đang xuất hiện từ vị trí đến , tính cả hai đầu mút. Thao tác thay màu tại vị trí thành ; thay đổi này có hiệu lực với mọi thao tác phía sau. Mỗi truy vấn phải dùng trạng thái của dãy sau toàn bộ phép thay màu đứng trước nó.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Dòng thứ hai chứa số nguyên là các màu ban đầu.
  • Mỗi trong dòng tiếp theo có dạng hoặc .

Output

  • Với mỗi thao tác , in trên một dòng số màu phân biệt trong đoạn được hỏi.

Constraints

  • .
  • Mọi màu ban đầu và màu trong thao tác thuộc .
  • Trong : ; trong : .
  • Input có ít nhất một thao tác .

Scoring

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

Example

Test 1

Input

5 7
1 2 1 3 2
Q 1 5
R 3 2
Q 1 3
R 4 1
Q 2 5
R 1 2
Q 1 4

Output

3
2
2
2

Giải thích: Ban đầu đoạn có ba màu. Sau hai lần đổi đầu tiên, các đoạn được hỏi lần lượt chứa hai màu; lần đổi cuối cũng không làm truy vấn cuối vượt quá hai màu.

Lời giải tóm tắt
  • Ý tưởng: Nén toàn bộ màu, gắn mỗi truy vấn với số update đã xảy ra, sắp các truy vấn theo Mo ba chiều (l,r,t) và duy trì tần suất cùng số màu có tần suất dương.
  • Tính đúng đắn: Mỗi truy vấn được gắn với đúng số phép thay màu đứng trước nó. Khi dịch thời gian, nếu vị trí sửa nằm trong cửa sổ thì ta xóa màu cũ, gán màu mới rồi thêm lại; ngoài cửa sổ chỉ cần đổi giá trị lưu. Vì cnt[c]>0 tương đương màu c đang xuất hiện, biến distinct luôn là đáp án.
  • Độ phức tạp: Xấp xỉ O((n+m)·n^(2/3)) thời gian và O(n+m) bộ nhớ.