trang chủ / đề bài / icpc23_nat_h

Truy vấn khó

Đề bài

Mô tả

Lokk yêu thích cấu trúc dữ liệu, và thú tiêu khiển ưa thích của Lokk là nghĩ ra những bài toán cấu trúc dữ liệu mới lạ rồi thách bạn bè giải. Hôm nay, Lokk nghĩ ra bài toán dưới đây và gửi cho Quang.

Cho mảng a gồm n phần tử a1,a2,…,an. Nhiệm vụ của bạn là xử lý q truy vấn thuộc các loại sau:

  • 1 p: Hoán đổi hai phần tử ap và ap+1.
  • 2 l r x: Tính tổng bình phương của tất cả các vị trí từ l đến r có phần tử bằng x. Nói cách khác, tính ∑i=lri2×[ai=x], trong đó [P] là biểu thức có giá trị 1 nếu P đúng và 0 nếu ngược lại.
  • 3 l r x: Gọi b là mảng gồm tất cả các vị trí trong mảng a có phần tử bằng x, liệt kê theo thứ tự tăng dần (từ 1 đến n). Tính ∑i=lrbi2.

Là một người giải bài xuất sắc, Quang nhanh chóng giải xong bài toán. Vì vậy, Lokk đặt thêm một thử thách: Quang phải trả lời các truy vấn trực tuyến, nghĩa là các truy vấn được mã hóa sao cho cần biết đáp án đúng của truy vấn hiện tại mới giải mã được truy vấn tiếp theo.

Điều này quá sức với Quang, nên Quang bỏ cuộc và nhờ các thí sinh giúp đỡ. Bạn có giải được không?

Dữ liệu vào

Dòng đầu tiên chứa hai số nguyên n và q (2≤n≤2×105, 1≤q≤2×105), độ dài mảng a và số truy vấn cần xử lý.

Dòng thứ hai chứa n số nguyên a1,a2,…,an (1≤ai≤n), các phần tử của mảng a.

Mỗi dòng trong q dòng tiếp theo mô tả một truy vấn cần xử lý. Số đầu tiên là t (1≤t≤3), loại truy vấn. Các truy vấn được mã hóa như sau: gọi last là đáp án của truy vấn loại 2 hoặc 3 gần nhất mà bạn đã trả lời (ban đầu last=0).

Nếu t=1, tiếp theo là một số nguyên p′ (1≤p′<n). Giải mã truy vấn bằng phép tính p=(p′+last−1)mod(n−1)+1.

Nếu t=2 hoặc t=3, tiếp theo là ba số nguyên l′, r′ và x′ (1≤l′,r′,x′≤n). Giải mã truy vấn bằng các phép tính sau:

  • l=(l′+last−1)modn+1
  • r=(r′+last−1)modn+1
  • x=(x′+last−1)modn+1
  • Nếu l>r, hoán đổi l và r.

Với t=3, dữ liệu bảo đảm r không vượt quá độ dài của mảng b (định nghĩa trong mô tả truy vấn).

Dữ liệu ra

Với mỗi truy vấn loại 2 hoặc 3, in ra một số nguyên là đáp án của truy vấn.

Ràng buộc

  • 2≤n≤2×105, 1≤q≤2×105
  • 1≤ai≤n
  • 1≤p′<n; 1≤l′,r′,x′≤n
  • Với truy vấn loại 3, r sau khi giải mã không vượt quá độ dài mảng b.

Ví dụ

Input Output Giải thích
7 8
1 2 1 3 2 1 2
2 1 6 1
3 6 5 4
2 3 3 6
2 1 7 5
1 6
2 6 1 1
3 7 6 5
2 4 4 7
46
45
0
0
10
58
36
Truy vấn 1 sau giải mã là 2 1 6 1: các vị trí từ 1 đến 6 có phần tử bằng 1 là 1, 3, 6, đáp án 12+32+62=46. Truy vấn 2 là 3 2 3 1: b=[1,3,6], đáp án 32+62=45. Truy vấn 3 là 2 6 6 2: a6=1≠2, đáp án 0. Truy vấn 4 là 2 1 7 5: không có phần tử nào bằng 5, đáp án 0. Truy vấn 5 là 1 6: hoán đổi a6 và a7, mảng thành [1,2,1,3,2,2,1]. Truy vấn 6 là 2 1 6 1, đáp án 12+32=10. Truy vấn 7 là 3 2 3 1, đáp án 32+72=58. Truy vấn 8 là 2 6 6 2, đáp án 62=36.
5 4
3 1 3 2 3
2 1 5 3
1 2
3 2 1 3
2 5 2 4
35
13
16
Ví dụ bổ sung. Các truy vấn sau giải mã: 2 1 5 3 (đáp án 12+32+52=35); 1 1 (mảng thành [1,3,3,2,3]); 3 1 2 3 (l=2, r=1 được hoán đổi; b=[2,3,5], đáp án 22+32=13); 2 3 5 2 (đáp án 42=16).

Bình luận

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

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0