根据题意,我们知道每个位置都是非负整数(你搞个负数只麻雀出来)……
于是当两个区间互相包含时,小的区间是没用的。
所以至多有 n 个区间,我们按照它们的左端点来维护。
我们用线段树来维护每个左端点对应的最大右端点的区间,以及它的区间和。
对于第一个操作,在线段树上二分找包含这个点的最靠左的区间。
然后把它的左端点到修改点这一段全部加 y(不必考虑没有贡献的区间,它们对答案没有影响)。
对于第二个操作,直接塞进线段树。
同时用一个树状数组维护区间和。
代码:
1 |
|
根据题意,我们知道每个位置都是非负整数(你搞个负数只麻雀出来)……
于是当两个区间互相包含时,小的区间是没用的。
所以至多有 n 个区间,我们按照它们的左端点来维护。
我们用线段树来维护每个左端点对应的最大右端点的区间,以及它的区间和。
对于第一个操作,在线段树上二分找包含这个点的最靠左的区间。
然后把它的左端点到修改点这一段全部加 y(不必考虑没有贡献的区间,它们对答案没有影响)。
对于第二个操作,直接塞进线段树。
同时用一个树状数组维护区间和。
代码:
1 | #include <cstdio> |