Cỗ máy thời gian

Xem dạng PDF

Gửi bài giải

Điểm: 2400 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 1G
Input: stdin
Output: stdout

Tác giả:
Nguồn bài:
tạ
Dạng bài
Ngôn ngữ cho phép
Ada, Assembly, Awk, Brain****, C, C#, C++, COBOL, D, Dart, F#, Forth, Fortran, Go, Groovy, Haskell, Intercal, Java, JS, Kotlin, Lisp, Lua, ObjC, OCaml, Pascal, Perl, PHP, Pike, Prolog, PyPy, Python, Racket, Ruby, Rust, Scala, Scheme, Scratch, Sed, Swift, TCL, Turing, VB, Zig

Ông Q (heygnauq sau này) là một nhà du hành thời gian vĩ đại, sở hữu cho mình một cỗ máy thời gian toàn năng có thể thay đổi cả tương lai. Tuy nhiên, ông vẫn gặp khó khăn với công việc, bị deadline dí như bao người khác.

Công việc của ông Q là hiệu chỉnh một dãy ~A~ gồm ~n~ số nguyên ban đầu thành một dãy hoàn hảo nhất để ổng được thăng quan tiến chức. Vì thời gian gấp rút nên khi điều chỉnh đến khi nào thấy dãy no hope quá thì ông Q sẽ dùng cỗ máy thời gian quay về một thời điểm mà ông đã từng trải qua khi đang hiệu chỉnh (có thể bao gồm những dòng thời gian song song khác) để có thể chạy kịp deadline với một dãy ~A~ hoàn hảo nhất có thể.

Vì dãy số ~A~ có thể rất dài nên ông Q không thể kiểm tra và tính toán hết được, ông ta chỉ có thể nhờ bạn thực hiện truy vấn điều chỉnh dãy số hoặc kiểm tra một đoạn trên đó. Ngoài ra, bạn còn phải giúp ổng du hành thời gian đến thời điểm sau một truy vấn bất kì đã trải qua trước đó.

~\texttt{Input}~

  • Dòng đầu tiên gồm 2 số nguyên ~n~ và ~q~ lần lượt là số phần tử của dãy ~A~ (các phần tử được đánh số từ ~1~ tới ~n~) và số truy vấn.

  • Dòng tiếp theo chứa ~n~ số nguyên lần lượt là ~n~ phần tử của dãy ~A~.

  • ~q~ dòng tiếp theo, dòng thứ ~i~ chứa thông tin của truy vấn thứ ~i~, một truy vấn có thể là:

    • ~\texttt{C l r s}~ ~(1 \le l \le r \le n)~: hiệu chỉnh tăng các phần tử từ ~A_l~ đến ~A_r~ lên ~s~ đơn vị.

    • ~\texttt{S l r}~ ~(1 \le l \le r \le n)~: tính tổng của dãy con từ ~A_l~ đến ~A_r~.

    • ~\texttt{B t}~: du hành thời gian đến thời điểm sau truy vấn thứ ~t~ (dữ liệu đảm bảo truy vấn này không thể quay về một truy vấn dạng ~\texttt{B}~ khác).

~\texttt{Output}~

  • Với mỗi truy vấn dạng ~\texttt{S}~, in ra một số nguyên duy nhất là tổng của dãy con ~(l, r)~ trên một dòng, vì kết quả có thể lớn nên hãy in ra phần dư khi chia cho ~10^9 + 7~.

~\texttt{Sample input}~

7 6
1 1 1 1 1 1 1
C 2 6 1
C 3 5 1
B 0
S 2 7
B 2
S 2 5

~\texttt{Sample output}~

6
11

~\texttt{Constraint}~

  • ~1 \le n \le 10^5~.

  • ~1 \le q \le 5.10^4~.

  • ~1 \le s, A_i \le 1000~.

~\texttt{Subtask}~

  • Subtask ~1 \space (10\%)~: Không có truy vấn dạng ~\texttt{B}~ và ~n \le 1000~, ~q \le 500~.

  • Subtask ~2 \space (20\%)~: Không có truy vấn dạng ~\texttt{B}~.

  • Subtask ~3 \space (30\%)~: ~l = r~ trong tất cả truy vấn dạng ~\texttt{C}~.

  • Subtask ~4 \space (40\%)~: Không có giới hạn gì thêm.

~\texttt{Notes}~

  • Ban đầu ông Q có dãy ~A = (1, 1, 1, 1, 1, 1, 1)~.

  • Sau truy vấn ~1~, dãy trở thành ~(1, 2, 2, 2, 2, 2, 1)~.

  • Sau truy vấn ~2~, dãy trở thành ~(1, 2, 3, 3, 3, 2, 1)~.

  • Truy vấn ~3~ yêu cầu ta du hành thời gian đến thời điểm ban đầu, khi dãy ~A~ là ~(1, 1, 1, 1, 1, 1, 1)~.

  • Truy vấn ~4~ yêu cầu in ra tổng của dãy con từ ~A_2~ tới ~A_7~: ~1 + 1 + 1 + 1 + 1 + 1 = 6 \space (\texttt{mod} \space 10^9 + 7)~.

  • Truy vấn ~5~ yêu cầu ta du hành về thời điểm sau truy vấn ~2~, tức là dãy ~(1, 2, 3, 3, 3, 2, 1)~.

  • Truy vấn cuối cùng yêu cầu in ra tổng của dãy con từ ~A_2~ tới ~A_5~: ~2 + 3 + 3 + 3 = 11 \space (\texttt{mod} \space 10^9 + 7)~.


Bình luận

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