poj 2892 터널 워 페 어 (트 리 배열 + 2 점)
1962 단어 ACM - 트 리 배열
#include
#include
#include
#include
#include
using namespace std;
#define N 55010
int c[N],a[N],v[N];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int d)
{
while(x0)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
memset(v,0,sizeof(v));
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
add(i,1);
int k=0,b;
while(m--)
{
getchar();
char s;
scanf("%c",&s);
if(s=='D')
{
scanf("%d",&b);
if(v[b]==0)
{
v[b]=1;
add(b,-1);
a[k++]=b;
}
}
else if(s=='R')
{
if(k)
{v[a[--k]]=0;
add(a[k],1);}
}
else if(s=='Q')
{
scanf("%d",&b);
if(v[b]==1){puts("0");continue;}
int l,r,mid,x,y;
l=0;r=b;
while(l<=r)
{
mid=(l+r)/2;
if(sum(b)-sum(mid)==(b-mid))//sum(a)-sum(b) a+1 b x=mid+1
{
x=mid+1;
r=mid-1;
}else l=mid+1;
}
l=b-1;r=n;
while(l<=r)
{
mid=(l+r)/2;
if(sum(mid)-sum(b-1)==(mid+1-b))//y=mid
{
y=mid;
l=mid+1;
}else r=mid-1;
}
printf("%d
",y-x+1);
}
}
return 0;
}