Bài này chúng ta chặt từng truy vấn với nhau, chặt truy vấn Q/1, Q/2, Q/4,... Q/2x .
Với mỗi lần chặt trong đoạn từ l−>r. Đặt mid=(l+r)/2. chúng ta update các truy vấn từ l−>mid và xử lí.
Dùng 2vector để lưu trạng thái đã được tưới nước đầy hay chưa ở đoạn l−>r đang xét. Xét đến cây vị trí i , S=get(i) nếu A[i]≤S thì cây ở vị trí thứ i đã được tưới đầy. Gán ret[i]=mid và ta thêm i vào vector có trạng thái đã tưới nước đủ. Còn không thì chúng ta thêm i vào vector có trạng thái tưới nước chưa đủ và A[i]−=S. Và cứ thế chặt cho đến lúc nào dừng thì thôi=).
Đây là code mẫu của mình:
cpp#∈clude<bitsstdc++.h>usingnamespacestd;#def∈ef∗ios::syncwithstdio(0);c∈.tie(0);cout.tie(0);#def∈elllonglong#def∈eel′n′#def∈epbpushback#def∈eall(x)x.beg∈(),x.end()#def∈e∈f64(ll)(1ll〈61)#def∈e∈f32∫(1〈30)#def∈eFOU(i,a,b)for(∫i=(a),b=(b);i≤b;++i)#def∈eFOD(i,a,b)for(∫i=(a),b=(b);i≥b;--i)#def∈eREP(i,n)for(∫i=0,n=(n);i<n;++i)const∫mod