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; }


좋은 웹페이지 즐겨찾기