canuc80k2420·21/50

Những Bước Nhảy Thoát Mảng

Nộp bài trên LQDOJ

Bài 24 · Sqrt Decomposition

Có ô được đánh số từ đến . Ở ô có một số dương . Nếu đang ở , bạn nhảy tới ; quá trình dừng ngay khi vị trí mới lớn hơn . Bạn phải xử lý các phép thay đổi một độ dài bước và các truy vấn về toàn bộ đường nhảy.

  • : gán .
  • : bắt đầu ở . In vị trí cuối cùng còn nằm trong mảng và số bước đã thực hiện, kể cả bước cuối làm chỉ số vượt .

Input

  • Dòng đầu chứa . Dòng thứ hai chứa số . Mỗi trong dòng sau mô tả một thao tác theo một trong hai dạng trên.

Output

  • Với mỗi truy vấn loại , in vị trí cuối cùng còn nằm trong mảng và tổng số bước nhảy đã thực hiện, kể cả bước đưa chỉ số ra ngoài.

Constraints

  • .
  • .
  • .
  • Mọi chỉ số được đánh số từ .

Scoring

  • Subtask ( điểm): .
  • Subtask ( điểm): không có ràng buộc bổ sung.

Example

Test 1

Input

6 5
2 3 1 2 1 4
1 1
0 3 4
1 1
1 2
0 6 1

Output

6 4
3 2
6 3

Giải thích: Ban đầu đường đi từ là , nên vị trí cuối là và có bước. Sau khi đặt , đường từ là ; còn từ là .

Lời giải tóm tắt
  • Ý tưởng: Chia chỉ số thành các khối. Với mỗi vị trí , lưu go[i] là vị trí đầu tiên sau khi nén chuỗi nhảy tới ngoài khối, cnt[i] là số bước thật đã nén và last[i] là vị trí cuối trong khối. Các trạng thái của một khối được tính từ phải sang trái. Khi sửa , chỉ cần xây lại khối chứa ; truy vấn ghép các đoạn nhảy đã nén.
  • Chứng minh đúng: Trong mỗi khối, trạng thái của dùng trực tiếp trạng thái đã đúng của vị trí đích lớn hơn , hoặc kết thúc ngay khi đích ra ngoài khối. Vì vậy bộ ba lưu trữ mô tả đúng toàn bộ chuỗi đến biên khối. Truy vấn nối các chuỗi rời nhau theo đúng thứ tự và cộng số bước thật nên cho đúng vị trí cuối cùng cùng tổng bước.
  • Độ phức tạp: Xây dựng ; cập nhật ; truy vấn ; bộ nhớ .