记录编号 152776 评测结果 AAAAAAAAAA
题目名称 [HNOI 2012] 永无乡 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 1.283 s
提交时间 2015-03-15 15:44:14 内存使用 2.60 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
struct www{int f,l,r,s,w,z;} A[100010];
char ch;
bool flag;
int n,m,i,zj1,zj2,zj3,zj,ROOT,NOW;

inline void ZIG(int &x)
{
	zj3=A[x].f,zj2=A[zj3].s;
	A[zj3].s-=A[x].s,A[zj3].s+=A[A[x].r].s;A[x].s=zj2;
	if(zj3==A[A[zj3].f].l)A[A[zj3].f].l=x;
	else A[A[zj3].f].r=x;A[x].f=A[zj3].f;
	A[zj3].l=A[x].r,A[A[x].r].f=zj3;
	A[zj3].f=x,A[x].r=zj3;
}
inline void ZAG(int &x)
{
	zj3=A[x].f,zj2=A[zj3].s;
	A[zj3].s-=A[x].s,A[zj3].s+=A[A[x].l].s;A[x].s=zj2;
	if(zj3==A[A[zj3].f].l)A[A[zj3].f].l=x;
	else A[A[zj3].f].r=x;A[x].f=A[zj3].f;
	A[zj3].r=A[x].l,A[A[x].l].f=zj3;
	A[zj3].f=x,A[x].l=zj3;
}
inline void splay(int x)
{
	while(A[x].f)
	{
		zj=A[x].f;
		if(!A[zj].f)if(x==A[zj].l)ZIG(x);else ZAG(x);
		else if(x==A[zj].l)
		if(zj==A[A[zj].f].l)ZIG(zj),ZIG(x);else ZIG(x),ZAG(x);
		else if(zj==A[A[zj].f].l)ZAG(x),ZIG(x);else ZAG(zj),ZAG(x);
	}
	ROOT=x;
}

inline void Insert(int x)
{
	NOW=ROOT;
	while(NOW)
	{
		A[zj=NOW].s++;
		if(A[x].w<A[NOW].w)NOW=A[NOW].l;
		else NOW=A[NOW].r;
	}
	if(A[x].w<A[zj].w)A[zj].l=x;else A[zj].r=x;
	A[x].f=zj,A[x].s=1,A[x].l=A[x].r=0;
}
inline void insert_dfs(int x)
{
	if(A[x].l)insert_dfs(A[x].l);
	if(A[x].r)insert_dfs(A[x].r);
	Insert(x);
}
inline void build(int u,int v)
{
	while(A[u].f)u=A[u].f;
	while(A[v].f)v=A[v].f;
	if(u==v)return;
	if(A[u].s<A[v].s)zj=u,u=v,v=zj;
	ROOT=u,insert_dfs(v);
}
void init()
{
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&A[i].w);
		A[i].s=1,A[i].z=i;
	}
	while(m--)
	{
		scanf("%d%d",&zj1,&zj2);
		build(zj1,zj2);
	}
}

inline void Find(int x,int k)
{
	splay(x);NOW=ROOT;zj=0;flag=0;
	while(NOW)
	{
		zj1=zj+A[A[NOW].l].s+1;
		if(zj1>k)NOW=A[NOW].l;
		else if(zj1<k)zj=zj1,NOW=A[NOW].r;
		else{flag=1;break;}
	}
	if(flag)printf("%d\n",A[NOW].z);
	else printf("-1\n");
}
void work()
{
	scanf("%d\n",&m);
	while(m--)
	{
		scanf("%c%d%d\n",&ch,&zj1,&zj2);
		if(ch=='Q')Find(zj1,zj2);
		else build(zj1,zj2);
	}
}
int main()
{
	freopen("bzoj_2733.in","r",stdin);
	freopen("bzoj_2733.out","w",stdout);
	init();
	work();
	return 0;
}