Advertisement
jeff69

Untitled

Jan 9th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1.  
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll;
  5. const int MX=3e5+6;
  6. int n , ar[MX], guid[MX];
  7. char bb[MX];int NN;
  8. struct State
  9. {
  10.     ll data;
  11.     ll i;
  12.     State()
  13.     {
  14.         data=0,i=0;
  15.     };
  16.     State(ll a,int c)
  17.     {
  18.         data=a;
  19.         i=c;
  20.     }
  21. };
  22. bool operator<(const State x,const State y)
  23. {
  24.     if(x.data<y.data)return 1;
  25.     return 0;
  26. }
  27. int id;
  28. int easy[4*MX];
  29. void insrt(int x=1,int l=0,int r=NN)
  30. {
  31.     int mid=(l+r)/2;
  32.     if(l==r&&r==id)
  33.     {
  34.         easy[x]++;return;
  35.     }
  36.     if(l<=id&&id<=mid)
  37.     {
  38.         insrt(2*x,l,mid);
  39.         easy[2*x+1]++;
  40.     }
  41.     else if(mid<id&&r>=id)
  42.     {
  43.         insrt(2*x+1,mid+1,r);
  44.     }
  45. }
  46. int getnum(int x=1,int l=0,int r=NN)
  47. {
  48.     int mid=(l+r)/2;
  49.     if(l==r&&r==id)
  50.     {
  51.         return easy[x];
  52.     }
  53.     if(l<=id&&id<=mid)
  54.     {
  55.         return getnum(2*x,l,mid)+ easy[x];
  56.     }
  57.     else if(mid<id&&r>=id)
  58.     {
  59.         return getnum(2*x+1,mid+1,r)+ easy[x];
  60.     }
  61.     return 0;
  62. }
  63. void kill(int x=1,int l=0,int r=NN)
  64. {
  65.     int mid=(l+r)/2;
  66.     if(l==r&&r==id)
  67.     {
  68.         easy[x]--;
  69.         return;
  70.     }
  71.     if(l<=id&&id<=mid)
  72.     {
  73.         easy[2*x+1]--;
  74.         kill(2*x,l,mid);
  75.     }
  76.     else if(mid<id&&r>=id)
  77.     {
  78.         kill(2*x+1,mid+1,r);
  79.     }
  80. }
  81. vector<State> vr;
  82. multiset<int> mst;
  83. int countheap(int x)
  84. {
  85.     int st=0,en=(int)vr.size() -1,num=0;
  86.     ll opt=-1e10;
  87.     while(st<=en)
  88.     {
  89.         id =(st+en)/2;
  90.         if(vr[id].data<x)
  91.         {
  92.             if(opt<=vr[id].data)
  93.             {
  94.                 opt=vr[id].data;
  95.                 num=id+1;
  96.             }
  97.             st=id+1;
  98.         }else en=id-1;
  99.     }
  100.     id=num-1;
  101.     return getnum();
  102. }
  103. int KTH(int k)
  104. {
  105.      int st=0,en=(int)vr.size()-1;
  106.      int opt=(int)vr.size()+1;
  107.         while(st<=en)
  108.             {
  109.                 id=(st+en)/2;
  110.                 if(getnum()>=k)
  111.                 {
  112.                     opt=min(id,opt);
  113.                     en=id-1;
  114.                 }else st=id+1;
  115.             }
  116.         return opt;
  117. }
  118. int main()
  119. {
  120.     cin>>n;
  121.     for(int i=1; i<=n; i++)
  122.        {
  123.           scanf(" %c%d",&bb[i],&ar[i]);
  124.           if(bb[i]=='I')vr.push_back({ar[i],i});
  125.        }
  126.      sort(vr.begin(),vr.end());
  127.      NN=(int)vr.size() -1;
  128.      for(int i=0;i<vr.size();i++)
  129.         guid[vr[i].i]=i;
  130.     for(int i=1;i<=n;i++)
  131.     {
  132.         if(bb[i]=='I')
  133.         {
  134.             if(mst.count(ar[i]))continue;
  135.             id=guid[i];
  136.             insrt();
  137.             mst.insert(ar[i]);
  138.         }
  139.         if(bb[i]=='D')
  140.         {
  141.             if(!mst.count(ar[i]))continue;
  142.             id=guid[i];
  143.             mst.erase(mst.find(ar[i]));
  144.             kill();
  145.         }
  146.         if(bb[i]=='C')
  147.         {
  148.             printf("%d\n",countheap(ar[i]));
  149.         }
  150.         if(bb[i]=='K')
  151.         {
  152.             int cur=KTH(ar[i]);
  153.             if(cur>=vr.size())printf("invalid\n");
  154.             else printf("%d\n",vr[cur].data);
  155.         }
  156.     }
  157.  
  158.     return 0;
  159.  
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement