zoukankan      html  css  js  c++  java
  • treap修订

      1 #include<cstdio>
      2 #include<cmath>
      3 #include<algorithm>
      4 #include<ctime>
      5 #include<queue>
      6 #include<cctype>
      7 #include<cstring>
      8 #include<iostream>
      9 #define PAU putchar(' ')
     10 #define ENT putchar('
    ')
     11 #define CH for(int d=0;d<=1;d++) if(ch[d])
     12 using namespace std;
     13 const int maxn=200000+10;
     14 struct node{
     15     node*ch[2];int r,v,siz;
     16     void init(){r=rand();siz=1;ch[0]=ch[1]=NULL;return;}
     17     void update(){siz=1;CH{siz+=ch[d]->siz;}return;}
     18 }treap[maxn],*root[maxn],*nodecnt=treap;
     19 queue<node*>RAM;
     20 node*newnode(){
     21     node*x;
     22     if(!RAM.empty()) x=RAM.front(),RAM.pop();
     23     else x=nodecnt++;
     24     x->init();return x;
     25 }
     26 void del(node*&x){RAM.push(x);return;}
     27 void rotate(node*&x,int d){
     28     node*k=x->ch[d^1];x->ch[d^1]=k->ch[d];k->ch[d]=x;
     29     x->update();k->update();x=k;return;
     30 }
     31 void insert(node*&x,int v){
     32     if(!x) x=newnode(),x->v=v;
     33     else{
     34         int d=v>x->v;insert(x->ch[d],v);
     35         if(x->ch[d]->r>x->r) rotate(x,d^1);
     36         else x->update();
     37     } return;
     38 }
     39 void remove(node*&x,int v){
     40     if(x->v==v){
     41         if(x->ch[0]&&x->ch[1]){
     42             int d=x->ch[0]->r>x->ch[1]->r;
     43             rotate(x,d);remove(x->ch[d],v);
     44         }
     45         else{
     46             node*k=x;
     47             if(x->ch[0]) x=x->ch[0];
     48             else x=x->ch[1];
     49             del(k);
     50         }
     51     }
     52     else remove(x->ch[v>x->v],v);
     53     if(x) x->update();return;
     54 }
     55 void print(node*&x){
     56     if(!x) return;
     57     print(x->ch[0]);
     58     printf("%d ",x->v);
     59     print(x->ch[1]);
     60     return;
     61 }
     62 int find(node*x,int rank){
     63     if(x->siz<rank||rank<1) return -1;
     64     int kth=x->ch[0]?x->ch[0]->siz+1:1;
     65     if(kth==rank) return x->v;
     66     if(kth>rank) return find(x->ch[0],rank);
     67     else return find(x->ch[1],rank-kth);
     68 }
     69 int fa[maxn];
     70 int findset(int x){return x==fa[x]?x:fa[x]=findset(fa[x]);}
     71 void merge(node*&x,node*&y){
     72     if(!y)return;if(!x){x=y;del(y);return;}
     73     merge(x,y->ch[0]);
     74     merge(x,y->ch[1]);
     75     insert(x,y->v);
     76     return;
     77 }
     78 void merge(int a,int b){
     79     a=findset(a);b=findset(b);
     80     if(a==b) return;
     81     if(root[a]->siz<root[b]->siz) swap(a,b);
     82     merge(root[a],root[b]);fa[b]=a;
     83     return;
     84 }
     85 inline int read(){
     86     int x=0,sig=1;char ch=getchar();
     87     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
     88     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
     89     return x*=sig;
     90 }
     91 inline char readc(){
     92     char ch=getchar();
     93     while(!isalpha(ch)) ch=getchar();
     94     return ch;
     95 }
     96 inline void write(int x){
     97     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
     98     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
     99     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    100 }
    101 int n,q,v[maxn];
    102 void init(){
    103     srand(time(0));
    104     n=read();q=read();
    105     for(int i=1;i<=n;i++) root[i]=newnode(),v[i]=root[i]->v=read(),fa[i]=i;
    106     return;
    107 }
    108 void work(){
    109     int a,b;char tp;
    110     while(q--){
    111         tp=readc();a=read();b=read();
    112         if(tp=='b') merge(a,b);
    113         else if(tp=='q') write(find(root[findset(a)],b)),ENT;
    114         else{
    115             remove(root[findset(a)],v[a]);
    116             insert(root[findset(a)],b);
    117             v[a]=b;
    118         }
    119     }
    120     return;
    121 }
    122 void print(){
    123     return;
    124 }
    125 int main(){init();work();print();return 0;}
  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/chxer/p/4672403.html
Copyright © 2011-2022 走看看