/*
树上主席树能够求出链上第k大, 然后启发式合并直接重构就好了
卡常数就卡呗
反正我就暴力重构了!! */
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long
#define mmp make_pair
#define M 100010
using namespace std;
int read() {
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
int fa[M][17], sz[M], rt[M], belong[M], n, m, T, cnt, a[M], b[M], deep[M], ans;
int t[M * 17 * 17], ls[M * 17 * 17], rs[M * 17 * 17];
vector<int> to[M];
char s[M]; void modify(int l, int r, int last, int &now, int v) {
now = ++cnt;
t[now] = t[last] + 1;
ls[now] = ls[last];
rs[now] = rs[last];
if(l == r) return;
int mid = (l + r) >> 1;
if(v <= mid) modify(l, mid, ls[last], ls[now], v);
else modify(mid + 1, r, rs[last], rs[now], v);
} void dfs(int now, int f, int zu) {
belong[now] = zu;
deep[now] = deep[f] + 1;
modify(1, n, rt[f], rt[now], a[now]);
fa[now][0] = f;
for(int i = 1; i <= 16; i++) fa[now][i] = fa[fa[now][i - 1]][i - 1];
for(int i = 0; i < to[now].size(); i++) {
int vj = to[now][i];
if(vj == f) continue;
dfs(vj, now, zu);
}
} int lca(int a, int b) {
if(deep[a] < deep[b]) swap(a, b);
int dep = deep[a] - deep[b];
for(int i = 0; dep; i++, dep >>= 1) if(dep & 1) a = fa[a][i];
if(a == b) return a;
for(int i = 16; i >= 0; i--) {
if(fa[a][i] == fa[b][i]) continue;
a = fa[a][i], b = fa[b][i];
}
return fa[a][0];
} int query(int l, int r, int rt1, int rt2, int rt3, int rt4, int k) {
if(l == r) return l;
int mid = (l + r) >> 1;
int v = t[ls[rt4]] + t[ls[rt3]] - t[ls[rt2]] - t[ls[rt1]];
if(k <= v) return query(l, mid, ls[rt1], ls[rt2], ls[rt3], ls[rt4], k);
else return query(mid + 1, r, rs[rt1], rs[rt2], rs[rt3], rs[rt4], k - v);
} int main() {
read();
n = read(), m = read(), T = read();
for(int i = 1; i <= n; i++) a[i] = b[i] = read();
sort(b + 1, b + n + 1);
for(int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b;
for(int i = 1; i <= m; i++) {
int vi = read(), vj = read();
to[vi].push_back(vj);
to[vj].push_back(vi);
}
for(int i = 1; i <= n; i++) {
if(!belong[i]) dfs(i, 0, i);
}
for(int i = 1; i <= n; i++) sz[belong[i]]++;
while(T--) {
scanf("%s", s + 1);
if(s[1] == 'Q') {
int vi = read() ^ ans, vj = read() ^ ans, k = read() ^ ans;
int l = lca(vi, vj);
ans = b[query(1, n, rt[l], rt[fa[l][0]], rt[vi], rt[vj], k)];
cout << ans << "\n";
} else {
int vi = read() ^ ans, vj = read() ^ ans;
if(sz[belong[vi]] > sz[belong[vj]]) swap(vi, vj);
sz[belong[vj]] += sz[belong[vi]];
sz[belong[vi]] = 0;
dfs(vi, vj, belong[vj]);
to[vi].push_back(vj);
to[vj].push_back(vi);
}
}
return 0;
}
/*
10
5 0 5
1 2 3 4 5
L 1 2
L 2 3
L 1 5
L 4 5
Q 3 4 1
*/

[SDOI2013]森林 (启发式合并)的更多相关文章

  1. BZOJ 3123 [SDOI2013] 森林 - 启发式合并 主席树

    Description 给你一片森林, 支持两个操作: 查询$x$到$y$的$K$大值,  连接两棵树中的两个点 Solution 对每个节点$x$动态开权值线段树, 表示从$x$到根节点路径上权值出 ...

  2. BZOJ 3123: [Sdoi2013]森林 [主席树启发式合并]

    3123: [Sdoi2013]森林 题意:一个森林,加边,询问路径上k小值.保证任意时刻是森林 LCT没法搞,树上kth肯定要用树上主席树 加边?启发式合并就好了,小的树dfs重建一下 注意 测试点 ...

  3. luoguP3302 [SDOI2013]森林 主席树 启发式合并

    题目链接 luoguP3302 [SDOI2013]森林 题解 本来这题树上主席树暴力启发式合并就完了 结果把lca写错了... 以后再也不这么写了 复杂度\(O(nlog^2n)\) "f ...

  4. P3302 [SDOI2013]森林(主席树+启发式合并)

    P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...

  5. [BZOJ3123][Sdoi2013]森林 主席树+启发式合并

    3123: [Sdoi2013]森林 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 第一行包含一个正整数testcase,表示当 ...

  6. BZOJ3123: [Sdoi2013]森林(启发式合并&主席树)

    3123: [Sdoi2013]森林 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4813  Solved: 1420[Submit][Status ...

  7. 【BZOJ3123】[Sdoi2013]森林 主席树+倍增LCA+启发式合并

    [BZOJ3123][Sdoi2013]森林 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整 ...

  8. BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并

    BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20 ...

  9. [bzoj3123][Sdoi2013]森林_主席树_启发式合并

    森林 bzoj-3123 Sdoi-2013 题目大意:给定一片共n个点的森林,T个操作,支持:连接两个不在一棵树上的两个点:查询一棵树上路径k小值. 注释:$1\le n,T \le 8\cdot ...

随机推荐

  1. [LeetCode&Python] Problem 703. Kth Largest Element in a Stream

    Design a class to find the kth largest element in a stream. Note that it is the kth largest element ...

  2. Python全栈之路----常用模块----re 模块

    正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是 re. re的匹配语法有以下几种 re.match 从头开始匹配 re.search 匹配包含 re.fin ...

  3. CentOS7.4部署Python3+Django+uWSGI+Nginx

    CentOS7.4部署Python3+Django+uWSGI+Nginx http://www.showerlee.com/archives/2590

  4. QT5.10+VS2013 TCP 一对一简单C/S架构通信

    ---恢复内容开始--- QT~俺老孙又回来啦~ 买的那本书上面关于tcp的内容就七八页,而且都是过于简单的东西,想进一步就要度娘很久很麻烦,还是喜欢看书(嘿嘿嘿~) 大致的思路就是两个项目,一个cl ...

  5. python如何输出文件的年月日

    import time print('{}BiasedMF312and4414_rt.txt'.format(time.strftime("%Y-%m-%d"))) 输出: 201 ...

  6. 如何安装私有 npm 包?

    安装私有 npm 包的步骤: 先安装私有 npm 包:npm install <npm包名> --registry=<npm包源> 然后运行npm install安装公共 np ...

  7. Flink神秘工具lib

    Flink里面有一个神坑,叫做FI坑.其实只是使用Fi的时候被暴露出来.但是,杀不死你的,终将使你更加强大. Flink集群有一个lib文件件,里面比较happy,可以放各种jar:这样,client ...

  8. lay-verify 无效

    lay-verify 无效 使用lay-verify有两个需要注意的地方: form标签需要添加 class="layui-form" 提交按钮需要添加 lay-submit=&q ...

  9. 【python】python打包生成的exe文件运行时提示缺少模块

    事情是这样的我用打包命令:pyinstaller -F E:\python\clpicdownload\mypython.py打包了一个exe程序,但是运行时提示我缺 少bs4模块然后我就去查pyin ...

  10. 【转】Mysql索引设计原则

    来源:https://segmentfault.com/a/1190000000473085 假设一高频查询如下SELECT * FROM user WHERE area='amoy' AND sex ...