1 struct Splay{ 2 struct obj{ 3 int s,v,cnt; 4 obj*f,*c[2]; 5 obj(int _v=0,int _cnt=0,obj*_f=null): 6 v(_v),cnt(_cnt),f(_f){c[0]=c[1]=null;} 7 void gets(){ 8 s=size(c[0])+cnt+size(c[1]); 9 } 10 }*root; 11 12 void rotate(obj*x){ 13 obj*y=x->f; 14 if(y==null)return; 15 int d=x==y->c[0]; 16 y->c[!d]=x->c[d]; 17 if(x->c[d])x->c[d]->f=y; 18 x->f=y->f; 19 if(y->f)y->f->c[y==y->f->c[1]]=x; 20 y->f=x,x->c[d]=y; 21 y->gets(),x->gets(); 22 if(y==root)root=x; 23 } 24 25 void splay(obj*x,obj*f){ 26 while(x->f!=f){ 27 if(x->f->f==f) rotate(x); 28 else rotate(((x->f->f->v>x->f->v)^(x->f->v>x->v))?x:x->f),rotate(x); 29 } 30 x->gets(); 31 } 32 33 void insert(int v){ 34 if(root==null){ 35 root=new obj(v,1,null); 36 return; 37 } 38 obj*x=root,*y=null; 39 while(x&&x->v!=v)y=x,x=x->c[v>x->v]; 40 if(x){ 41 x->cnt++; 42 splay(x,null); 43 }else{ 44 x=new obj(v,1,y); 45 if(y)y->c[v>y->v]=x; 46 splay(x,null); 47 } 48 } 49 50 void del(int v){ 51 obj*x=root; 52 while(x&&x->v!=v)x=x->c[v>x->v]; 53 if(x==null)return; 54 else if(x->cnt>1){ 55 x->cnt--; 56 splay(x,null); 57 return; 58 } 59 splay(x,null); 60 if(x->c[0]){ 61 x=x->c[0]; 62 while(x->c[1])x=x->c[1]; 63 splay(x,root); 64 x->f=null,x->c[1]=root->c[1]; 65 if(root->c[1])root->c[1]->f=x; 66 swap(x,root); 67 delete x; 68 }else{ 69 x=x->c[1]; 70 if(x)x->f=null; 71 swap(x,root); 72 delete x; 73 } 74 } 75 76 void display(obj*root){ 77 if(!root)return; 78 display(root->c[0]); 79 printf("%d ",root->v); 80 display(root->c[1]); 81 } 82 83 obj*kth(int k){ 84 for(obj*x=root;x;){ 85 if(size(x->c[0])+1==k)return x; 86 else if(size(x->c[0])>=k)x=x->c[0]; 87 else k-=size(x->c[0])+1,x=x->c[1]; 88 } 89 } 90 91 void clean(obj*x){ 92 if(x==null)return; 93 clean(x->c[0]),clean(x->c[1]); 94 delete x; 95 } 96 97 int next(int v){ 98 int ans=INF; 99 for(obj*x=root;x;){ 100 if(x->v>v)ans=min(ans,x->v),x=x->c[0]; 101 else x=x->c[1]; 102 } 103 return ans; 104 } 105 106 int prev(int v){ 107 int ans=-INF; 108 for(obj*x=root;x;){ 109 if(x->v<v)ans=max(ans,x->v),x=x->c[1]; 110 else x=x->c[0]; 111 } 112 return ans; 113 } 114 115 int knum(int v){ 116 obj*x=root; 117 while(x&&x->v!=v)x=x->c[v>x->v]; 118 if(x)return x->cnt; 119 else return 0; 120 } 121 122 int rank(int v){ 123 obj*x=root; 124 int ans=0; 125 while(x&&x->v!=v){ 126 if(x->v<v) ans+=size(x->c[0])+x->cnt,x=x->c[1]; 127 else x=x->c[0]; 128 } 129 return ans+(x?size(x->c[0]):0); 130 } 131 132 void init(){clean(root);root=null;} 133 Splay(){root=null;} 134 ~Splay(){clean(root);root=null;} 135 }; 136 137 int l[maxn],r[maxn],ls[maxn],rs[maxn],mid[maxn],lotree; 138 Splay data[maxn]; 139 int build(int _l, int _r){ 140 int root=lotree++; 141 l[root]=_l,r[root]=_r,mid[root]=(_l+_r)/2,data[root].init(); 142 if(_l!=_r)ls[root]=build(_l,mid[root]),rs[root]=build(mid[root]+1,_r); 143 else ls[root]=-1,rs[root]=-1; 144 return root; 145 } 146 147 int arr[maxn]; 148 void add(int root,int pos, int _data){ 149 if(root==-1)return; 150 data[root].insert(_data); 151 if (pos<=mid[root])add(ls[root],pos,_data); 152 else add(rs[root],pos,_data); 153 } 154 155 void modify(int root,int pos,int _data){ 156 if(root==-1)return; 157 data[root].del(arr[pos]); 158 data[root].insert(_data); 159 if (pos<=mid[root])modify(ls[root],pos,_data); 160 else modify(rs[root],pos,_data); 161 } 162 163 int next(int root, int _l, int _r, int v){ 164 _l=max(_l,l[root]),_r=min(_r,r[root]); 165 if(_l>_r)return INF; 166 if(_l==l[root]&&_r==r[root])return data[root].next(v); 167 else return min(next(ls[root],_l,_r,v),next(rs[root],_l,_r,v)); 168 } 169 170 int prev(int root, int _l, int _r, int v){ 171 _l=max(_l,l[root]),_r=min(_r,r[root]); 172 if(_l>_r)return -INF; 173 if(_l==l[root]&&_r==r[root])return data[root].prev(v); 174 else return max(prev(ls[root],_l,_r,v),prev(rs[root],_l,_r,v)); 175 } 176 177 int rank(int root,int _l,int _r,int k){ 178 _l=max(_l,l[root]),_r=min(_r,r[root]); 179 if(_l>_r)return 0; 180 if(_l==l[root]&&_r==r[root])return data[root].rank(k); 181 else return rank(ls[root],_l,_r,k)+rank(rs[root],_l,_r,k); 182 } 183 184 int knum(int root,int _l,int _r,int k){ 185 _l=max(_l,l[root]),_r=min(_r,r[root]); 186 if(_l>_r)return 0; 187 if(_l==l[root]&&_r==r[root])return data[root].knum(k); 188 else return knum(ls[root],_l,_r,k)+knum(rs[root],_l,_r,k); 189 } 190 191 int kth(int root,int _l,int _r,int k){ 192 int head=0,tail=100000001; 193 while(tail-head>1){ 194 int mid=(head+tail)/2; 195 if (rank(root, _l,_r,mid)<k)head=mid; 196 else tail=mid; 197 } 198 return head; 199 } 200 201 int main() 202 { 203 //FF; 204 int n,m; 205 while(~scanf("%d%d",&n,&m)){ 206 lotree=0; 207 int root=build(1,n); 208 for(int i=1;i<=n;i++)scanf("%d",arr+i),add(root,i,arr[i]); 209 while(m--){ 210 int o,t1,t2,t3; 211 scanf("%d",&o); 212 switch(o){ 213 case 1: 214 scanf("%d%d%d",&t1,&t2,&t3); 215 printf("%d\n",rank(root,t1,t2,t3)+1); 216 break; 217 case 2: 218 scanf("%d%d%d",&t1,&t2,&t3); 219 printf("%d\n",kth(root,t1,t2,t3)); 220 break; 221 case 3: 222 scanf("%d%d",&t1,&t2); 223 modify(root,t1,t2); 224 arr[t1]=t2; 225 break; 226 case 4: 227 scanf("%d%d%d",&t1,&t2,&t3); 228 printf("%d\n",prev(root,t1,t2,t3)); 229 break; 230 case 5: 231 scanf("%d%d%d",&t1,&t2,&t3); 232 printf("%d\n",next(root,t1,t2,t3)); 233 break; 234 } 235 } 236 } 237 }
时间: 2024-10-13 00:50:54