总感觉没问题了但是洛谷过不了(数据点全wa),然后下载了数据对比了一下前面和后面的,没有区别;然后我在y总的acwing里面提交时是 Accepted 的,求大佬指教!!!
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
int n, m, q, cnt, a[N], an[N], rt[N], f[N];
struct Node{
int l ,r, sum;
}node[N * 60];
int find(int x){
return f[x] == x ? x : f[x] = find(f[x]);
}
int build(int l, int r, int v){
int p = ++ cnt;
node[p].sum ++;
if(l == r) return p;
int mid = (l + r) >> 1;
if(v <= mid) node[p].l = build(l, mid, v);
else node[p].r = build(mid + 1, r, v);
return p;
}
void add(int &rx, int ry){
if(!ry) return;
if(!rx){ rx = ry; return; }
node[rx].sum += node[ry].sum;
add(node[rx].r, node[ry].r);
add(node[rx].l, node[ry].l);
}
int query(int k, int p, int l, int r){
if(l == r) return l;
int mid = (l + r) >> 1;
if(k > node[node[p].l].sum)
return query(k - node[node[p].l].sum, node[p].r, mid + 1, r);
else
return query(k, node[p].l, l, mid);
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1;i <= n; i++){
scanf("%d", &a[i]);
rt[i] = build(1, n, a[i]);
f[i] = i, an[a[i]] = i;
}
for(int i = 1;i <= m;i ++){
int x, y;
scanf("%d%d", &x, &y);
int rx = find(x), ry = find(y);
if(rx != ry){
add(rt[rx], rt[ry]);
f[ry] = f[rx];
}
}
scanf("%d", &q);
while(q --){
char op;
int x, y;
getchar();
scanf("%c %d %d", &op, &x, &y);
if(op == 'Q'){
int rx = find(x);
if(node[rt[rx]].sum < y) printf("-1\n");
else
printf("%d\n", an[query(y, rt[rx], 1, n)]);
}
else{
int rx = find(x), ry = find(y);
if(rx != ry){
add(rt[rx], rt[ry]);
f[ry] = f[rx];
}
}
}
return 0;
}