Bài này có 2 bài toán con cần giải quyết. Thứ nhất là xử lý cái vụ cộng mấy số lên k
lần trên mỗi đoạn truy vấn. Thứ hai là xử lý các truy vấn max. Cái thứ 2 thì đơn giản rồi nếu ta đã có được mảng kết quả của các truy vấn đầu tiên, bằng cách sử dụng segment tree hoặc RMQ để tìm max trên từng đoạn.
Vậy còn bài toán thứ nhất. Ta sử dụng trick như sau: Với đoạn [l,r]
được tăng lên k
đơn vị, ta tăng a[l]
lên k
, sau đó thằng a[r+1]
ta giảm đi k
. Khi đó sau m
truy vấn tăng, ta duyệt mảng rồi cập nhật a[i] += a[i-1]
, khi đó những mỗi giá trị trong đoạn [l,r]
sẽ được cộng đúng như các truy vấn. Do đó ta chỉ cần O(m)
cho các truy vấn cộng.