Description
berber走进机房,边敲门边喊:“我是哔哔”
CRAZY转过头:“我警告你,哔哔刚刚来过!”
“呵呵呵呵……”
这时,哔哔站了起来,环顾四周:“你们笑什么?……”
巧了,发出笑声的人都排成了一排,每个人刚开始发出的笑声值为a[i]的笑声。但是有些笑声哔哔是听不出来的,他只听得出笑声值只包含2和3的数字,比如说什么2333。
但是同学们还是很会秀操作的。对于操作add l r x表示l到r的同学的笑声值同时加上x。数据保证操作完的x在2*10^4以内。
但是,哔哔还是很想知道哪些人在笑。对于count l r表示询问l到r的同学中有多少个笑声值是哔哔听得出来的(就是只由2和3组成)。
哔哔是很忙的,他需要坐在旁边的你来帮他完成这个问题。
Solution
首先x是正数,在20000内只有30个数用贡献,我们用线段树维护每个数离最近有贡献数多少,维护区间最小,最小有多少个,及一个最小的位置。只要最小值小于0就暴力重构那个点,移到离下一个数的距离。
code
using namespace std;
int const mn=3*1e5+9,inf=1e9+7;
int n,m,a[mn],b[mn],pos[mn*4],cnt[mn*4],mi[mn