10分求条 萌新刚学平衡树
查看原帖
10分求条 萌新刚学平衡树
965007
SMXChina楼主2025/7/25 22:31
#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=3e5+10;

int n,rt,tot,siz[N],cnt[N],val[N],son[N][2],fa[N],arr[N],m;

struct ask
{
	int l,r,k;
}asks[N];

bool cmp(ask a1,ask a2)
{
	return a1.l<a2.l;
}

void pushup(int x)
{
	siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];
	return ;
}

int getopt(int x)
{
	return son[fa[x]][1]==x;
}

void cle(int x)
{
	son[x][0]=son[x][1]=cnt[x]=val[x]=siz[x]=0;
	return ;
}

void rotate(int x)
{
	int y=fa[x],z=fa[y],opt=getopt(x);
	son[y][opt]=son[x][opt^1];
	fa[son[y][opt]]=y;
	son[x][opt^1]=y;
	fa[x]=z;
	if(z)
	{
		son[z][getopt(y)]=x;
	}
	fa[y]=x;
	pushup(x);
	pushup(y);
	return ;
}

void splay(int x)
{
	for(int f;f=fa[x];rotate(x))
	{
		if(fa[f])
		{
			if(getopt(x)==getopt(f))
			{
				rotate(f);
			}
			else
			{
				rotate(x);
			}
		}
	}
	rt=x;
	return ;
}

void insert(int x)
{
	if(!rt)
	{
		rt=++tot;
		siz[tot]=cnt[tot]=1;
		val[tot]=x;
		return ;
	}
	int now=rt,f=0;
	while(1)
	{
		if(val[now]==x)
		{
			cnt[now]++;
			pushup(now);
			pushup(f);
			splay(now);
			break;
		}
		f=now;
		now=son[now][x>val[now]];
		if(!now)
		{
			fa[++tot]=f;
			siz[tot]=cnt[tot]=1;
			son[f][x>val[f]]=tot;
			val[tot]=x;
			pushup(f);
			splay(tot);
			break;
		}
	}
	return ;
}

int kth(int k)
{
	int now=rt;
	while(k)
	{
//	cout<<111<<endl;
		if(k<=siz[son[now][0]]) now=son[now][0];
		else
		{
			int tmp=siz[son[now][0]]+cnt[now];
			if(k<=tmp) return val[now];
			k-=tmp;
			now=son[now][1];
		}
	}
	return val[now];
}

int askrank(int k)
{
	int now=rt,res=0;
	while(now)
	{
		if(k<val[now]) now=son[now][0];
		else
		{
			res+=siz[son[now][0]];
			if(k==val[now])
			{
				splay(now);
				return res+1;
			}
			res+=cnt[now];
			now=son[now][1];
		}
	}
	return res+1;
}

int pre(int k)
{
	int now=son[rt][0];
	while(son[now][1]) now=son[now][1];
	return now;
}

int nxt(int k)
{
	int now=son[rt][1];
	while(son[now][0]) now=son[now][0];
	return now;
}

void del(int x)
{
	int rk=askrank(x);
	if(cnt[rt]>1)
	{
		cnt[rt]--;
		pushup(rt);
		return ;
	}
	if(!son[rt][0]&&!son[rt][1])
	{
		cle(rt);
		rt=0;
		return ;
	}
	if(!son[rt][0])
	{
		int oldrt=rt;
		rt=son[rt][1];
		fa[rt]=0;
		cle(oldrt);
		return ;
	}
	if(!son[rt][1])
	{
		int oldrt=rt;
		rt=son[rt][0];
		fa[rt]=0;
		cle(oldrt);
		return ;
	}
	int mx=pre(x),oldrt=rt;
	splay(mx);
	son[rt][1]=son[oldrt][1];
	fa[son[oldrt][1]]=rt;
	cle(oldrt);
	pushup(rt);
	return ;
}

signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>arr[i];
	for(int i=1;i<=m;i++)
	{
		cin>>asks[i].l>>asks[i].r>>asks[i].k;
	}
	sort(asks+1,asks+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		if(asks[i-1].r>=asks[i].l)
		{
			for(int j=asks[i-1].l;j<asks[i].l;j++) del(arr[j]);
			for(int j=asks[i-1].r+1;j<=asks[i].r;j++) insert(arr[j]);
		}
		else
		{
			for(int j=asks[i-1].l;j<=asks[i-1].r;j++) del(arr[j]);
			for(int j=asks[i].l;j<=asks[i].r;j++) insert(arr[j]);
		}
		cout<<kth(asks[i].k)<<endl;
	}
	return 0;
}
2025/7/25 22:31
加载中...