1. 程式人生 > >分塊入門——區間加法,區間查詢x的字首

分塊入門——區間加法,區間查詢x的字首

題目連結

給出一個長為 n​n​ 的數列,以及 n​n​ 個操作,操作涉及區間加法,詢問區間內小於某個值 xx​ 的前驅(比其小的最大元素)。

Input

第一行輸入一個數字 n,1≤n≤100000n,1≤n≤100000。

第二行輸入 n個非負整數,第 ii個數字為 ai(0≤ai≤109)ai(0≤ai≤109)以空格隔開。

接下來輸入n 行詢問,每行輸入四個數字 opt、l、r、c(c>0)opt、l、r、c(c>0),以空格隔開。

若 opt=0,表示將位於[l,r][l,r]的之間的數字都加 cc。

若 opt=1,表示詢問[l,r][l,r]中 cc 的前驅的值(不存在則輸出 −1−1)。

Output

對於每次詢問,輸出一行一個數字表示答案。

保證所有資料在int範圍內

Sample Input

4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4

Sample Output

3
-1

像這種xjb更新,xjb查詢的都可以考慮用分塊做

要點:對於不是整個區間的暴力搜尋即可,對於是一個完整區間的二分查詢x;

用二分查詢的時候可以把每個塊用一個數組或是集合存下來,然後排序二分;

用集合的話就不需要手動sort了,再更新資料的時候也比較方便,只需要單個erase,單個的insert

如果用陣列的話需要對整個陣列進行重建,陣列維護區間排序的題解:

L一道普通題