题目链接
给出一个长为 nn 的数列,以及 nn 个操作,操作涉及区间加法,询问区间内小于某个值 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一道普通题