Tahp và hoán vị ẩn

Xem dạng PDF

Gửi bài giải


Điểm: 0,01 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Tahp đang nghiên cứu một cách biểu diễn hoán vị bằng một dãy số nguyên. Cụ thể, xét một hoán vị ~p_1, p_2, \ldots, p_n~ của các số nguyên từ ~1~ đến ~n~. Với mỗi vị trí ~i~, Tahp định nghĩa một giá trị ~f_i~ như sau:

$$f_i = |\{j \mid 1 \le j < i,\ p_j < p_i\}|$$

Nói cách khác, ~f_i~ là số lượng phần tử đứng trước vị trí ~i~ trong hoán vị ~p~ nhưng có giá trị nhỏ hơn ~p_i~.

Ví dụ, nếu ~p = [2, 6, 4, 1, 5, 3]~, thì:

  • ~f_1 = 0~, vì trước vị trí ~1~ không có phần tử nào.

  • ~f_2 = 1~, vì trước ~p_2 = 6~ có một phần tử nhỏ hơn nó, đó là ~2~.

  • ~f_3 = 1~, vì trước ~p_3 = 4~ có một phần tử nhỏ hơn nó, đó là ~2~.

  • ~f_4 = 0~, vì trước ~p_4 = 1~ không có phần tử nào nhỏ hơn nó.

  • ~f_5 = 3~, vì trước ~p_5 = 5~ có ba phần tử nhỏ hơn nó, đó là ~2, 4, 1~.

  • ~f_6 = 2~, vì trước ~p_6 = 3~ có hai phần tử nhỏ hơn nó, đó là ~2, 1~.

Do đó, dãy ~f~ tương ứng với hoán vị trên là ~[0, 1, 1, 0, 3, 2]~.

Rõ ràng, với mọi hoán vị ~p~, dãy ~f~ thu được luôn thỏa mãn: ~0 \le f_i < i~. Điều thú vị là chiều ngược lại cũng đúng. Với mọi dãy số nguyên ~f_1, f_2, \ldots, f_n~ thỏa mãn ~0 \le f_i < i~, có thể chứng minh rằng tồn tại duy nhất một hoán vị ~p_1, p_2, \ldots, p_n~ sao cho dãy ~f~ được định nghĩa từ ~p~ theo công thức trên.

Trong bài toán này, bạn được cho dãy ~f~ ban đầu. Sau đó, dãy ~f~ sẽ thay đổi qua các thao tác cập nhật. Sau mỗi lần cập nhật, dữ liệu luôn đảm bảo rằng dãy ~f~ vẫn thỏa mãn ~0 \le f_i < i~, vì vậy hoán vị tương ứng với dãy ~f~ hiện tại luôn tồn tại và là duy nhất.

Bạn cần xử lý ~q~ thao tác. Mỗi thao tác thuộc một trong ba dạng sau:

  • + i: tăng ~f_i~ lên ~1~.

  • - i: giảm ~f_i~ đi ~1~.

  • ? l r: xét hoán vị ~p~ duy nhất tương ứng với dãy ~f~ hiện tại, hãy in ra giá trị ~p_l + p_{l+1} + \cdots + p_r~.


Một hoán vị độ dài ~n~ là một dãy gồm ~n~ số nguyên, trong đó mỗi số nguyên từ ~1~ đến ~n~ xuất hiện đúng một lần.

Input

Dòng đầu tiên chứa hai số nguyên ~n~ và ~q~ ~(2 \le n \le 5 \cdot 10^5;\ 1 \le q \le 5 \cdot 10^5)~  — độ dài dãy ~f~ và số lượng thao tác.

Dòng thứ hai chứa ~n~ số nguyên ~f_1, f_2, \ldots, f_n~ ~(0 \le f_i < i~ với mọi ~1 \le i \le n)~.

Mỗi dòng trong ~q~ dòng tiếp theo mô tả một thao tác thuộc một trong ba dạng sau:

  • + i ~(1 \le i \le n)~: tăng ~f_i~ lên ~1~.

  • - i ~(1 \le i \le n)~: giảm ~f_i~ đi ~1~.

  • ? l r ~(1 \le l \le r \le n)~: yêu cầu tính tổng ~p_l + p_{l+1} + \cdots + p_r~, trong đó ~p~ là hoán vị duy nhất tương ứng với dãy ~f~ hiện tại.

Đảm bảo tại mọi thời điểm, dãy ~f~ vẫn thỏa mãn ~0 \le f_j < j~ với mọi ~1 \le j \le n~, và có ít nhất một thao tác truy vấn ?.

Output

Với mỗi thao tác dạng ? l r, in ra trên một dòng một số nguyên là giá trị ~p_l + p_{l+1} + \cdots + p_r~, trong đó ~p~ là hoán vị duy nhất tương ứng với dãy ~f~ hiện tại.

Scoring

Subtask Điểm Ràng buộc
1 ~1000~ ~n, q \le 5000~
1 ~1500~ ~n, q \le 100\,000~
2 ~500~ Không có ràng buộc gì thêm
Tổng ~3000~

Sample Input 1

6 10
0 1 1 0 3 2
? 2 5
+ 4
- 5
+ 3
- 2
? 1 4
+ 6
- 4
+ 5
? 2 5

Sample Output 1

16
14
14

Notes

Ban đầu, dãy ~f~ là ~[0, 1, 1, 0, 3, 2]~. Hoán vị tương ứng là ~p = [2, 6, 4, 1, 5, 3]~. Do đó, truy vấn ? 2 5 có đáp án ~p_2 + p_3 + p_4 + p_5 = 6 + 4 + 1 + 5 = 16~.

Sau các thao tác + 4, - 5, + 3, - 2, dãy ~f~ trở thành ~[0, 0, 2, 1, 2, 2]~. Hoán vị tương ứng lúc này là ~p = [5, 1, 6, 2, 4, 3]~. Vì vậy, truy vấn ? 1 4 có đáp án ~p_1 + p_2 + p_3 + p_4 = 5 + 1 + 6 + 2 = 14~.

Sau các thao tác + 6, - 4, + 5, dãy ~f~ trở thành ~[0, 0, 2, 0, 3, 3]~. Hoán vị tương ứng lúc này là ~p = [3, 2, 6, 1, 5, 4]~. Vì vậy, truy vấn cuối cùng ? 2 5 có đáp án ~p_2 + p_3 + p_4 + p_5 = 2 + 6 + 1 + 5 = 14~.


Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.