递归写法:(这道题应该还有非递归写法,以后再填坑)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
const int maxn=50010;
int lsum[maxn<<2],rsum[maxn<<2],sum[maxn<<2];
bool pure[maxn<<2];//1代表全为0 0代表不全为0
stack<int> sta;
void Pushup(int rt) {
pure[rt]=pure[rt<<1]&&pure[rt<<1|1];
sum[rt]=max(rsum[rt<<1]+lsum[rt<<1|1],max(sum[rt<<1],sum[rt<<1|1]));//当前区间的最大连续=max(三部分)
lsum[rt]=pure[rt<<1]?lsum[rt<<1]+lsum[rt<<1|1]:lsum[rt<<1];//左半区间全连续:当前区间llen = 右半区间llen(tlen) + 左半区间llen
rsum[rt]=pure[rt<<1|1]?rsum[rt<<1|1]+rsum[rt<<1]:rsum[rt<<1|1];
}
void BuildTree(int l,int r,int rt) {//建树后叶子结点全为1
sum[rt]=lsum[rt]=rsum[rt]=r-l+1;
pure[rt]=1;
if(l==r)
return;
int m=l+r>>1;
BuildTree(l,m,rt<<1);
BuildTree(m+1,r,rt<<1|1);
}
void Update(int L,int l,int r,bool flag,int rt) {
if(l==r) {
sum[rt]=lsum[rt]=rsum[rt]=flag;
pure[rt]=flag;
return;
}
int m=l+r>>1;
if(L<=m)
Update(L,l,m,flag,rt<<1);
else
Update(L,m+1,r,flag,rt<<1|1);
Pushup(rt);
}
/*int Query(int L,int rt) {
}*/
int QueryL(int L,int R,int left,int right,int n) {
if(L<=left && right<=R)
return lsum[n];
int mid=left+right>>1,lans,rans;
if(R<=mid)
return QueryL(L,R,left,mid,n<<1);
else if(L>mid)
return QueryL(L,R,mid+1,right,n<<1|1);
else {
lans=QueryL(L,mid,left,mid,n<<1);
rans=QueryL(mid+1,R,mid+1,right,n<<1|1);
if(lans == mid-L+1)
return lans+rans;
return lans;
}
}
int QueryR(int L,int R,int left,int right,int n) {
if(L<=left && right<=R)
return rsum[n];
int mid=left+right>>1,lans,rans;
if(R<=mid)
return QueryR(L,R,left,mid,n<<1);
else if(L>mid)
return QueryR(L,R,mid+1,right,n<<1|1);
else {
lans=QueryR(L,mid,left,mid,n<<1);
rans=QueryR(mid+1,R,mid+1,right,n<<1|1);
if(rans == R-mid)
return lans+rans;
return rans;
}
}
int main(void) {
//freopen("E:\\input.txt","r",stdin);
ios::sync_with_stdio(false);
int n,m,temp;
while(cin>>n>>m) {
while(!sta.empty()){
sta.pop();
}
BuildTree(1,n,1);
for(int i=1; i<=m; i++) {
char ch;
cin>>ch;
if(ch=='D') {//flag=0
cin>>temp;
Update(temp,1,n,0,1);
sta.push(temp);
} else if(ch=='Q') {
cin>>temp;
int ans=QueryL(temp,n,1,n,1)+QueryR(1,temp,1,n,1);
cout<<(ans>0?ans-1:0)<<endl;
} else if(ch=='R') {//flag=1
temp=sta.top();
Update(temp,1,n,1,1);
sta.pop();
}
}
}
return 0;
}