题目链接:https://www.luogu.org/problemnew/show/P2184
思路:维护两棵线段树+区间查询
我们来观察下面的情况↓
我们发现每个区间内的地雷种数=查询区间右端点左边L的个数-查询区间左端点左边R的个数
于是我们维护两棵线段树,一棵存L,一棵存R,区间查询作差即可
上代码↓
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=(1<<18-1);
int n,m,p,l,r;
int tree1[1<<18],tree2[1<<18];
int main(){
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&p,&l,&r);
if(p==1){
for(int i=MAXN+l;i;i>>=1) ++tree1[i];
for(int i=MAXN+r;i;i>>=1) ++tree2[i];
}else{
int le=MAXN;
l+=MAXN;
int sum1=0,sum2=0;
while(le^l^1){
if(~le&1) sum1+=tree2[le^1];
if(l&1) sum1+=tree2[l^1];
le>>=1;
l>>=1;
}le=MAXN;r=MAXN+r+1;
while(le^r^1){
if(~le&1) sum2+=tree1[le^1];
if(r&1) sum2+=tree1[r^1];
le>>=1;
r>>=1;
}printf("%d\n",sum2-sum1);
}
}return 0;
}