[poj2985]The k-th Largest Group[Treap]

  1 #include <iostream>
  2 #include <algorithm>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <cmath>
  7 #include <ctime>
  8 
  9 using namespace std;
 10 
 11 class    Treap
 12 {
 13     private:
 14         struct    Treap_Point
 15         {
 16             int    l,r,val,size,key,num;
 17             Treap_Point() { l=r=val=size=key=num=0; }
 18         };
 19         typedef    Treap_Point    P;
 20         P    d[210000];
 21         int    root,cnt;
 22 
 23         void    update(const int t)
 24         {
 25             d[t].size=d[d[t].l].size+
 26                 d[d[t].r].size+d[t].num;
 27             return ;
 28         }
 29 
 30         void    rturn(int & t)
 31         {
 32             int    temp=d[t].l; d[t].l=d[temp].r; d[temp].r=t;
 33             d[temp].size=d[t].size; update(t);t=temp; return ;
 34         }
 35 
 36         void    lturn(int & t)
 37         {
 38             int    temp=d[t].r; d[t].r=d[temp].l; d[temp].l=t;
 39             d[temp].size=d[t].size; update(t);t=temp; return ;
 40         }
 41 
 42         void    insert(int & t,const int x)
 43         {
 44             if(!t)
 45             {
 46                 cnt++;t=cnt;
 47                 d[t].size=d[t].num=1;d[t].val=x;
 48                 d[t].key=rand();
 49                 return ;
 50             }
 51             d[t].size++;
 52             if(d[t].val==x)d[t].num++;
 53             else if(x>d[t].val)
 54             {
 55                 insert(d[t].r,x);
 56                 if(d[d[t].r].key<d[t].key)lturn(t);
 57             }
 58             else
 59             {
 60                 insert(d[t].l,x);
 61                 if(d[d[t].l].key<d[t].key)rturn(t);
 62             }
 63             return ;
 64         }
 65 
 66         void    erase(int & t,const int x)
 67         {
 68             if(!t)return ;
 69             if(d[t].val==x)
 70             {
 71                 if(d[t].num>1)
 72                 {
 73                     d[t].num--;d[t].size--;return ;
 74                 }
 75                 if(d[t].l*d[t].r==0)t=d[t].l+d[t].r;
 76                 else if(d[d[t].l].key<d[d[t].r].key)
 77                     rturn(t),erase(t,x);
 78                 else    lturn(t),erase(t,x);
 79             }
 80             else if(x>d[t].val)d[t].size--,erase(d[t].r,x);
 81             else    d[t].size--,erase(d[t].l,x);
 82             return ;
 83         }
 84 
 85         int    get(const int & t,const int x)
 86         {
 87             if(t==0)return 0;
 88             if(x<=d[d[t].l].size)
 89                 return get(d[t].l,x);
 90             else if(x>d[d[t].l].size+d[t].num)
 91                 return get(d[t].r,x-d[d[t].l].size-d[t].num);
 92             return d[t].val;
 93         }
 94     public:
 95         Treap() { root=0;cnt=0; }
 96 
 97         void    insert(const int x) { insert(root,x); }
 98         void    erase(const int x) { erase(root,x); }
 99         int    get(const int x) { return get(root,x); }
100 };
101 
102 int    n,m;
103 int    fa[210000],Size[210000];
104 Treap    S;
105 
106 int    get_anc(const int x)
107 {
108     return fa[x]==x ? x:fa[x]=get_anc(fa[x]);
109 }
110 
111 int main()
112 {
113     int    i,op,x,y,a,b;
114 
115     scanf("%d%d",&n,&m);
116 
117     for(i=1;i<=n;++i)fa[i]=i,S.insert(-1),Size[i]=1;
118     
119     for(i=1;i<=m;++i)
120     {
121         scanf("%d",&op);
122         if(op==1)
123         {
124             scanf("%d",&x);
125             printf("%d\n",-S.get(x));
126         }
127         else
128         {
129             scanf("%d%d",&x,&y);
130             a=get_anc(x),b=get_anc(y);
131             if(a==b)continue;
132             else
133             {
134                 S.erase(-Size[a]);
135                 S.erase(-Size[b]);
136                 S.insert(-Size[a]-Size[b]);
137                 fa[a]=b;
138                 Size[b]+=Size[a];
139             }
140         }
141     }
142 
143     return 0;
144 }

 

posted @ 2015-12-31 02:15  Gster  阅读(221)  评论(0编辑  收藏  举报