K-query II

Xem dạng PDF

Gửi bài giải

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

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

Cho một dãy ~n~ phần tử ~a_{1}~, ~a_{2}~, ..., ~a_{n}~ và một số các truy vấn-k. Ngoài ra còn có một số thao tác cập nhật.

Một thao tác cập nhật là một cặp (~i~, ~v~) nghĩa là ~a_{i}~ cần được gán giá trị ~v~.

Một truy vấn-k là một bộ ba (~i~, ~j~, ~k~) (~1~ ~\leq~ ~i~ ~\leq~ ~j~ ~\leq~ ~n~).

Với mỗi truy vấn-k (~i~, ~j~, ~k~), bạn phải trả về số phần tử lớn hơn ~k~ nằm trong dãy con ~a_{i}~, ~a_{i+1}~, ..., ~a_{j}~.

Input

  • Dòng ~1~: ~n~ (~1~ ~\leq~ ~n~ ~\leq~ ~30000~).
  • Dòng ~2~: ~n~ số ~a_{1}~, ~a_{2}~, ..., ~a_{n}~ (~1~ ~\leq~ ~a_{i}~ ~\leq~ ~10^{4}~).
  • Dòng ~3~: ~q~ (~1~ ~\leq~ ~q~ ~\leq~ ~200000~), số truy vấn và cập nhật.
  • ~q~ dòng tiếp theo, số đầu tiên trong mỗi dòng là ~0~ hoặc ~1~. Số ~0~ theo sau bởi ~2~ số ~i~ và ~v~ (~1~ ~\leq~ ~i~ ~\leq~ ~n~, ~1~ ~\leq~ ~v~ ~\leq~ ~10^{4}~) cho biết một thao tác cập nhật. Số ~1~ theo sau bởi ~3~ số nguyên ~i~, ~j~, ~k~ (~1~ ~\leq~ ~i~ ~\leq~ ~j~ ~\leq~ ~n~, ~1~ ~\leq~ ~k~ ~\leq~ ~10^{4}~) cho biết một truy vấn-k.

Output

  • Với mỗi truy vấn-k (~i~, ~j~, ~k~), in ra số phần tử lớn hơn ~k~ trong dãy con ~a_{i}~, ~a_{i+1}~, ..., ~a_{j}~ trên một dòng.

Sample Input

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

Sample Output

2
1
2

Bình luận

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



  • 7
    trangtrangVN  đã bình luận lúc 20, Tháng 2, 2024, 6:56 sửa 37

    K-Query 2 làm như sau:

    * Giải thuật bình thường: Dùng chia căn, chia mảng ra sqrt(n) block.Mỗi block dùng fenwick tree để quản lí.

    • Update: O(log(10000));
    • Trả lời: O(log(10000)*sqrt(n) + sqrt(n))
    • Tổng: O(q(log(10000)sqrt(n) + sqrt(n)))
    • Làm như trên sẽ TLE nên ta dùng segment tree để quản lí các block:

    // Build:

    • build(1,1,sqrt(n)) // Cách build đọc trên wiki vì không có gì đặc biệt
    • Độ phức tạp O(m*log(m)) với m = sqrt(n);

    +// Update:

    • int id = id của block quản lí vị trí update
    • while(id/=2) updateBIT(id,val,-1);
    • val = giá trị mới
    • id = id của block quản lí vị trí update
    • while(id/=2) updateBIT(id,val,1);
    • Độ phức tạp O(log(sqrt(n))*log(10000)) với m = sqrt(n);

    //Get:

    • Viết hàm get như segment tree bình thường (lưu ý xử lí chia căn)
    • Độ phức tạp O(log(sqrt(n))*log(10000)) với m = sqrt(n);
    • Phần updateBIT và getBIT tham khảo bài viết Binary Indexed Tree của vnoi

    //Code tham khảo: (Hãy AC bài trước khi tham khảo)

    https://ideone.com/l8Y2Xb

    • Vậy là sẽ làm được bài này
    • Happy coding!

  • -13
    ti21_phnam  đã bình luận lúc 24, Tháng 11, 2022, 3:44

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


    • -13
      ti20_ntson  đã bình luận lúc 24, Tháng 11, 2022, 5:10

      Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


      • -6
        2211khanhdh  đã bình luận lúc 13, Tháng 7, 2023, 9:35

        Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


      • -14
        ti21_phnam  đã bình luận lúc 24, Tháng 11, 2022, 8:09

        Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -22
    khanhtuanitk20  đã bình luận lúc 25, Tháng 12, 2021, 16:11

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -52
    chicken_hand  đã bình luận lúc 2, Tháng 9, 2021, 3:13 chỉnh sửa

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.