建立操作树,即1和3操作时i-1向i连边,2操作中k向i连边,然后dfs一遍

那么当我们走到一个节点,就执行该操作(修改也是操作),退出后取消该操作即可

于是相当于要维护一个东西,支持:1.加边;2.删边;3.询问联通块的第k小

容易想到按秩合并并查集,考虑询问操作:用分块,维护每一个权值块的权值数量(要离散)

然后就可以确定答案所在权值块,再依次枚举里面的权值并判断是否在联通块内即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define K 1000
5 #define bl(k) ((k-1)/K)
6 struct ji{
7 int nex,to;
8 }edge[N];
9 vector<int>v[N];
10 int E,n,m,p[N],a[N],x[N],y[N],b[N],head[N],sz[N],fa[N],ans[N],f[N][105];
11 bool cmp(int x,int y){
12 return a[x]<a[y];
13 }
14 void add(int x,int y){
15 edge[E].nex=head[x];
16 edge[E].to=y;
17 head[x]=E++;
18 }
19 int find(int k){
20 if (k==fa[k])return k;
21 return find(fa[k]);
22 }
23 int query(int k){
24 x[k]=find(x[k]);
25 for(int i=0;i<=bl(n);i++)
26 if (y[k]>f[x[k]][i])y[k]-=f[x[k]][i];
27 else
28 for(int j=i*K+1;j<=(i+1)*K;j++)
29 if ((find(b[j])==x[k])&&(--y[k]==0))return a[b[j]];
30 return -1;
31 }
32 void add(int k){
33 x[k]=find(x[k]);
34 y[k]=find(y[k]);
35 if (x[k]==y[k])return;
36 if (sz[x[k]]>sz[y[k]])swap(x[k],y[k]);
37 fa[x[k]]=y[k];
38 sz[y[k]]+=sz[x[k]];
39 for(int i=0;i<=bl(n);i++)f[y[k]][i]+=f[x[k]][i];
40 }
41 void del(int k){
42 if (x[k]==y[k])return;
43 fa[x[k]]=x[k];
44 sz[y[k]]-=sz[x[k]];
45 for(int i=0;i<=bl(n);i++)f[y[k]][i]-=f[x[k]][i];
46 }
47 void dfs(int k){
48 if (p[k]==1)add(k);
49 if (p[k]==3)ans[k]=query(k);
50 for(int i=head[k];i!=-1;i=edge[i].nex)dfs(edge[i].to);
51 if (p[k]==1)del(k);
52 }
53 int main(){
54 scanf("%d%d",&n,&m);
55 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
56 memset(head,-1,sizeof(head));
57 for(int i=1;i<=n;i++)fa[i]=b[i]=i;
58 sort(b+1,b+n+1,cmp);
59 for(int i=1;i<=n;i++)sz[i]=f[b[i]][bl(i)]=1;
60 for(int i=1;i<=m;i++){
61 scanf("%d%d",&p[i],&x[i]);
62 if (p[i]==2)add(x[i],i);
63 else{
64 scanf("%d",&y[i]);
65 add(i-1,i);
66 }
67 }
68 dfs(0);
69 for(int i=1;i<=m;i++)
70 if (p[i]==3)printf("%d\n",ans[i]);
71 }

最新文章

  1. [AR+Vuforia]学习笔记
  2. 在firefox浏览器下,scrollTop始终为0的问题
  3. DependencyProperties or INotifyPropertyChanged ?
  4. Java6 String.substring()方法的内存泄露
  5. (BFS)hdoj2377-Bus Pass
  6. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(五)-- Filter
  7. python操作json
  8. 理解js中的闭包
  9. c++ 字符串工具类
  10. (1/18)重学Standford_iOS7开发_iOS概述_课程笔记
  11. 为什么java不支持多重继承?
  12. Codeforces Round #204 (Div. 2): A
  13. python之enumerate枚举 第二篇(六):enumerate枚举
  14. lighttpd配置虚拟主机/php等WEB环境
  15. Redis 集群解决方案比较
  16. GPS定位开发
  17. 修复intellij idea 2017.2中文输入法无候选框,亲测可以用
  18. HDFS HA: 高可靠性分布式存储系统解决方案的历史演进
  19. 在php中实现Redis的订阅与发布
  20. Java:IO流-流的操作规律和转换流

热门文章

  1. 从零入门 Serverless | SAE 的远程调试和云端联调
  2. 洛谷4400 BlueMary的旅行(分层图+最大流)
  3. DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告
  4. pycharm环境下配置scrap爬虫环境
  5. 使用Servlet前Tomcat介绍
  6. kivy浮点布局
  7. 机器学习:SVM
  8. [对对子队]会议记录5.16(Scrum Meeting3)
  9. OO_JAVA_JML系列作业_单元总结
  10. STM32的I2C框图详解及通讯过程