P2343,#5WA,求助!
查看原帖
P2343,#5WA,求助!
740607
Fzrcy楼主2022/8/5 21:37
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define root t[0].ch[1]
#define inf 0x3f3f3f3f
inline int read()
{
    register int x=0,t=1;
    register char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-'){t=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    return x*t;
}
struct Splay
{
    int p,k,ch[2],cnt,size;
}t[100001];
int tot;

inline void get_size(int x)
{
    t[x].size=t[t[x].ch[0]].size+t[t[x].ch[1]].size+t[x].cnt;
}

inline int check(int x)
{
    return x==t[t[x].p].ch[0]?0:1;
}

inline void change(register int x,register int father,register int f)
{
    t[x].p=father;
    t[father].ch[f]=x;
}

inline void rotate(register int x)
{
    register int y=t[x].p,z=t[t[x].p].p;
    register int yson=check(x),zson=check(y);
    change(t[x].ch[yson^1],y,yson);
    change(x,z,zson);
    change(y,x,yson^1);
    get_size(y);
    get_size(x);
}

inline void splay(register int x,register int to)
{
    to=t[to].p;
    while(t[x].p!=to)
    {
        register int y=t[x].p;
        if(t[y].p==to)rotate(x);
        else
            if(check(x)==check(y))
                rotate(y),rotate(x);
            else
                rotate(x),rotate(x);
    }
    return;
}

inline int create_a_new_point(register int x,register int father)
{
    t[++tot].k=x;
    t[tot].p=father;
    t[tot].size=t[tot].cnt=1;
    return tot;
}

inline void splay_insert(register int x)
{
    register int now=root;
    if(root==0)
    {
        create_a_new_point(x,0);
        root=tot;
        return;
    }
    while(1)
    {
        t[now].size++;
        if(t[now].k==x)
        {
            t[now].cnt++;
            splay(now,root);
            return;
        }
        register int f=x<t[now].k?0:1;
        if(t[now].ch[f]==0)
        {
            int fa=create_a_new_point(x,now);
            t[now].ch[f]=fa;
            splay(fa,root);
            return;
        }
        now=t[now].ch[f];
    }
}

inline int splay_find_number(register int x)
{
    register int now=root;
    while(1)
    {
        int K=t[now].size-t[t[now].ch[1]].size;
        if(t[t[now].ch[0]].size<x&&x<=K)
        {
            splay(now,root);
            return t[now].k;
        }
        if(x<K) now=t[now].ch[0];
        else now=t[now].ch[1],x-=K;
    }
}

int cnts;
signed main()
{
    register int x,y;
    register int n,q;
    n=read();
    q=read();
    splay_insert(inf);
    splay_insert(-inf);
    for(register int i=1; i<=n; i++)
    {
    	x=read();
    	splay_insert(-x);
	}
    for(register int i=1; i<=q; i++)
    {
        x=read();
        y=read();
        if(x==2)splay_insert(-y);
        if(x==1)printf("%d\n",abs(splay_find_number(y+1)));
   }
    return 0;
}
2022/8/5 21:37
加载中...