版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37960603/article/details/82765648
题目传送门
每个询问其实是求前面有多少个区间与之相交
答案就是:前面区间数量-与前面区间不相交数量
与前面区间不相交数量=前面区间 l 大于询问 r 的数量 + 前面区间 r 小于询问 l 的数量
代码:
#include<cstdio>
using namespace std;
#define low(x) (x&(-x))
const int maxn=50000+100;
int treel[maxn],treer[maxn];
int n,m;
void Add(int *tree,int x){
while(x<=n){
tree[x]++;
x+=low(x);
}
}
int GetSum(int *tree,int x){
int sum=0;
while(x){
sum+=tree[x];
x-=low(x);
}
return sum;
}
int main(){
scanf("%d%d",&n,&m);
int type,l,r;
int typeonenum=0;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&type,&l,&r);
if(type==2) printf("%d\n",typeonenum-GetSum(treel,n)+GetSum(treel,r)-GetSum(treer,l-1));
if(type==2) continue;
else typeonenum++;
Add(treel,l);
Add(treer,r);
}
}