fhq

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
    char ch;x=0;bool fl=false;
    while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
    for(x=numb;isdigit(ch=getchar());x=x*10+numb);
    (fl==true)&&(x=-x);
}
namespace Miracle{
const int N=100000+5;
const int inf=0x3f3f3f3f;
struct node{
    int pri;
    int ch[2];
    int val;
    int sz;
}t[N];
int tot;
int rt;
int n;
int nc(int v){
    t[++tot].val=v;t[tot].sz=1;
    t[tot].pri=rand();
    return tot;
}
void pushup(int x){
    t[x].sz=t[t[x].ch[1]].sz+t[t[x].ch[0]].sz+1;
}
int merge(int x,int y){
    if(!x||!y) return x+y;
    if(t[x].pri<t[y].pri){
        t[x].ch[1]=merge(t[x].ch[1],y);
        pushup(x);
        return x;
    }else{
        t[y].ch[0]=merge(x,t[y].ch[0]);
        pushup(y);
        return y;
    }
}
void split(int now,int k,int &x,int &y){
    if(!now){
        x=0;y=0;return;
    }
    if(t[now].val<=k){
        x=now;
        split(t[now].ch[1],k,t[now].ch[1],y);
    }else{
        y=now;
        split(t[now].ch[0],k,x,t[now].ch[0]);
    }
    pushup(now);
}
int kth(int k){
    int x=rt;
    while(1){
        if(t[t[x].ch[0]].sz+1==k) return x;
        int tmp=t[t[x].ch[0]].sz+1;
        if(tmp<k){
            k-=tmp;x=t[x].ch[1];
        }else{
            x=t[x].ch[0];
        }
    }
}
int main(){
    srand(19260817);
    rd(n);
    int op,x;
    int le=0,ri=0;
    while(n--){
        rd(op);rd(x);
        switch (op){
            case 1:{
                split(rt,x,le,ri);
                rt=merge(merge(le,nc(x)),ri);
                break;
            }
            case 2:{
                int zz;
                split(rt,x,le,zz);
                split(le,x-1,le,ri);
                //le=t[le].ch[0];//warning!!! maybe wrong
                ri=merge(t[le].ch[0],t[le].ch[1]);
                rt=merge(merge(le,),ri);
                break;
            }
            case 3:{
                split(rt,x-1,le,ri);
                printf("%d\n",t[le].sz+1);
                rt=merge(le,ri);
                break;
            }
            case 4:{
                int tmp=kth(x);
                printf("%d\n",t[tmp].val);
                break;
            }
            case 5:{
                split(rt,x-1,le,ri);
                printf("%d\n",t[le].val);
                rt=merge(le,ri);
                break;
            }
            case 6:{
                split(rt,x,le,ri);
                printf("%d\n",t[ri].val);
                rt=merge(le,ri);
                break;
            }
        }
    }
    return 0;
}

}
signed main(){
    Miracle::main();
    return 0;
}

/*
   Author: *Miracle*
   Date: 2019/1/5 21:36:18
*/


猜你喜欢

转载自www.cnblogs.com/Miracevin/p/10226576.html
fhq