Cho cây N đỉnh đánh số từ 1, đỉnh thứ i có trọng số nguyên không âm Ai.
Có Q truy vấn, truy vấn thứ t(1≤t≤Q) được mô tả bằng 3 số nguyên dương xt,yt,wt với ý nghĩa là gán Ai=Ai%wt với mọi đỉnh i nằm trên đường đi từ xt đến yt.
Yêu cầu: Sau mỗi truy vấn thứ t, in ra (A1%t)+(A2%t)+⋯+(An%t).
Giới hạn:
N,Q≤2×105.
0≤Ai≤2×105.
Tính điểm:
Subtask 1(20%): N,Q≤5000.
Subtask 2(20%): Cây là đường thẳng 1−2−⋯−N và Ai≤2.
Subtask 3(20%): Cây là đường thẳng 1−2−⋯−N và xt=yt ở mọi truy vấn.
Subtask 4(20%): Cây là đường thẳng 1−2−⋯−N.
Subtask 5(20%): Không có ràng buộc gì thêm.
2. Subtask 1
Duyệt trâu, độ phức tạp O(NQ).
3. Subtask 2
Dễ thấy từ truy vấn thứ 3 trở đi thì kết quả là cố định nên chỉ cần tính kết quả ở truy vấn 1,2,3.
4. Subtask 3
Ta có Ai%t=Ai−⌊tAi⌋×t nên ta chỉ cần tính tổng ⌊tA1⌋+⋯+⌊tAn⌋. Mặc khác có tối đa 2Ai giá trị khác nhau của ⌊tAi⌋ nên ta có thể cập nhật lại tổng dễ dàng. Độ phức tạp là O(NN).
5. Subtask 4
Sử dụng SegmentTree, mỗi nút quản lý min. Do mỗi lần chia lấy dư số đó giữ nguyên hoặc giảm đi ít nhất một nửa nên mỗi nút lá của SegmentTree được thăm không quá log(Ai) lần. Từ đó ở truy vấn t, nếu ta thấy min của nút hiện tại trên SegmentTree lớn hơn t thì bỏ qua và không xét các nút con của nút đó nữa.
Sử dụng thêm FenwickTree để truy vấn f(x) là tổng các số Ai≤x và g(x) là số lượng số Ai≤x. Nhận xét vì mỗi số thay đổi không quá log(Ai) lần nên số lần cập nhật trên FenwickTree không quá NlogN.
Đặt f(l,r)=f(r)−f(l−1) và g(l,r)=g(r)−g(l−1). Ở truy vấn thứ t để lấy kết quả, ta lấy tổng: