分块入门——区间加法,区间查询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一道普通题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值