【题目】http://acm.hdu.edu.cn/showproblem.php?pid=1540
【题意】
【思路】
【代码】
#include<bits/stdc++.h>
using namespace std;
const int M=50005;
int n,m;
int s[M],top;//s为模拟栈
class node
{
public:
int l,r,ls,rs,ms;
};
node a[M<<2];
void init(int p,int l,int r)
{
a[p].l=l;
a[p].r=r;
a[p].ls=a[p].rs=a[p].ms=r-l+1;
if(l!=r)
{
int mid=(l+r)/2;
init(p*2,l,mid);
init(p*2+1,mid+1,r);
}
}
void update(int i,int t,int x)
{
if(a[i].l==a[i].r)
{
if(x==1)
a[i].ls=a[i].rs=a[i].ms=1;
else
a[i].ls=a[i].rs=a[i].ms=0;
return;
}
int mid=(a[i].l+a[i].r)/2;
if(t<=mid)
update(i*2,t,x);
else
update(i*2+1,t,x);
a[i].ls=a[i*2].ls;
a[i].rs=a[i*2+1].rs;
a[i].ms=max(max(a[i*2].ms,a[i*2+1].ms),a[i*2].rs+a[i*2+1].ls);
if(a[i*2].ls==a[i*2].r-a[i*2].l+1)
a[i].ls+=a[i*2+1].ls;
if(a[i*2+1].rs==a[i*2+1].r-a[i*2+1].l+1)
a[i].rs+=a[i*2].rs;
}
int query(int i,int t)
{
if(a[i].l==a[i].r||a[i].ms==0||a[i].ms==a[i].r-a[i].l+1)
return a[i].ms;
int mid=(a[i].r+a[i].l)/2;
if(t<=mid)
{
if(t>=a[i*2].r-a[i*2].rs+1)
return query(i*2,t)+query(i*2+1,mid+1);
else
return query(i*2,t);
}
else
{
if(t<=a[i*2+1].l+a[i*2+1].ls-1)
return query(i*2+1,t)+query(i*2,mid);
else
return query(i*2+1,t);
}
}
int main()
{
//stack<int>s;
while(~scanf("%d%d",&n,&m))
{
init(1,1,n);
while(m--)
{
char t[5];
int x;
scanf("%s",t);
if(t[0]=='D')
{
scanf("%d",&x);
update(1,x,0);
s[top++] = x;//s.push(x);
}
else if(t[0]=='Q')
{
scanf("%d",&x);
printf("%d\n",query(1,x));
}
else
{
if(x>0)
{
x = s[--top];//int x=s.top();s.pop();
update(1,x,1);
}
}
}
}
}