2733

思路:

  启发式合并splay(n*log^2n);

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 100001 int n,q,tot,ch[maxn*][],key[maxn*],w[maxn*],opi[maxn*],m;
int size[maxn*],root[maxn],id[maxn*],f[maxn],cnt,dis[maxn*],lar[maxn]; inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} inline int getson(int now)
{
return ch[opi[now]][]==now;
} inline void updata(int now)
{
size[now]=w[now];
if(ch[now][]) size[now]+=size[ch[now][]];
if(ch[now][]) size[now]+=size[ch[now][]];
} inline void rotate(int now)
{
int fa=opi[now],ffa=opi[fa],pos=getson(now);
ch[fa][pos]=ch[now][pos^];
if(ch[fa][pos]) opi[ch[fa][pos]]=fa;
if(ffa) ch[ffa][getson(fa)]=now;
ch[now][pos^]=fa,opi[fa]=now,opi[now]=ffa;
updata(fa),updata(now);
} inline void splay(int now,int to)
{
for(int fa;fa=opi[now];rotate(now))
{
if(opi[fa]) rotate(getson(now)==getson(fa)?fa:now);
}
root[to]=now;
} inline void insert(int x,int y,int to)
{
if(!root[to])
{
root[to]=++tot,key[tot]=x,w[tot]=size[tot]=,id[tot]=y;
return ;
}
int now=root[to],fa=;
while()
{
fa=now;
if(x<key[now]) now=ch[now][];
else now=ch[now][];
if(!now)
{
now=ch[fa][x>key[fa]]=++tot;
key[now]=x,id[now]=y,w[now]=size[now]=,opi[now]=fa;
splay(now,to);break;
}
}
} inline int find(int x)
{
if(x==f[x]) return x;
return f[x]=find(f[x]);
} inline int irank(int k,int to)
{
int now=root[to];
while()
{
int dis=size[ch[now][]];
if(k<=dis) now=ch[now][];
else
{
k-=dis;
if(k<=w[now])
{
splay(now,to);
return id[now];
}
else k-=w[now],now=ch[now][];
}
}
} inline void merge(int noww,int now)
{
if(!now) return ;
if(ch[now][]) merge(noww,ch[now][]);
insert(key[now],id[now],noww);
if(ch[now][]) merge(noww,ch[now][]);
} int main()
{
in(n),in(m);int x,y;char ch[];
for(int i=;i<=n;i++) in(dis[i]),f[i]=i,insert(dis[i],i,i),lar[i]=;
for(;m--;)
{
in(x),in(y);
x=find(x),y=find(y);
if(lar[x]<lar[y]) swap(x,y);lar[x]+=lar[y];
if(x!=y) f[y]=x,merge(x,root[y]);
}
in(q);
for(;q--;)
{
scanf("%s",ch);in(x),in(y);
if(ch[]=='Q')
{
x=find(x);
if(y<=size[root[x]]) printf("%d\n",irank(y,x));
else printf("-1\n");
}
else
{
x=find(x),y=find(y);
if(lar[x]<lar[y]) swap(x,y);lar[x]+=lar[y];
if(x!=y) f[y]=x,merge(x,root[y]);
}
}
return ;
}

最新文章

  1. gedit 没有preference项,使preference回归,并用命令行设置行号,text wrapping等
  2. Linux sort命令
  3. Javascript杂记(一)
  4. Backbone Model——数据模型
  5. 诚聘Android开发工程师
  6. C#中String.Empty,“”,NULL的区别
  7. linux之稀疏文件
  8. JDBC连接MySQL数据库及演示样例
  9. [原创] SQLite数据库使用清单(下)
  10. python之Lambda函数---笔记
  11. 【BZOJ2816】【ZJOI2012】网络(Link-Cut Tree)
  12. SpringBoot的spring-boot-starter有哪些(官方)
  13. codeblocks 输入、输出文件的位置
  14. spring-data-jpa中findOne与getOne的区别 getOne没数据 findOne有数据
  15. yarn 用户导致的被挖矿 启用Kerberos认证功能,禁止匿名访问修改8088端口
  16. 查找——图文翔解HashTree(哈希树)
  17. 锁、volatile、CAS 比较
  18. 哈哈,原来IOC容器的bean是存在DefaultSingletonBeanRegistry的一个Map类型的属性当中。
  19. (一)安装openvpn服务器端
  20. MySQL中阻塞

热门文章

  1. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column &#39;s.areaname&#39; in &#39;field list&#39;错误
  2. C#正则表达式引发的CPU跑高问题以及解决方法
  3. 如何自己编译apue.3e中代码 &amp; 学习写makefile
  4. loadrunner 欺骗ip设置
  5. jenkins 连接服务器并运行脚本
  6. bash 语言的乘法表
  7. ipa和ironic-conductor交互
  8. HTML5应用:setCustomValidity(message)接口
  9. Java 以及JEE环境快速搭建
  10. 内存泄漏(memory leak)和内存溢出