P2184 贪婪大陆
P2184 贪婪大陆
用树状数组记录前\(i\)长度共有\(sum1\)个区间结束,前\(j\)长度共用\(sum2\)个区间开始,答案显然为\(sum2-sum1\)。
善用指针减少代码量:
#include <cstdio>
#define MAXN 100010
#define lowbit(x) ((x)&(-(x)))
using namespace std;
int n,m;
int tre_h[MAXN], tre_t[MAXN];
void add(int *a, int x, int val){
for(register int i=x;i<=n;i+=lowbit(i))
*(a+i)+=val;
}
int get_sum(int *a, int x){
int ans=0;
for(register int i=x;i>0;i-=lowbit(i)){
ans+=*(a+i);
}
return ans;
}
int main()
{
scanf("%d %d", &n, &m);
while(m--){
int opt,l,r;scanf("%d %d %d", &opt, &l, &r);
if(opt==1) add(tre_h, l, 1),add(tre_t, r, 1);
else printf("%d\n", get_sum(tre_h, r)-get_sum(tre_t, l-1));
}
return 0;
}