题意
给你n个点每个点都有一个value,m次操作,
?是查询第u个节点的父亲节点(包括自己)里最小的value,
+是把u设为v的父亲节点
思路
并查集+缩边
没想到缩边所以一直T46....
因为每个点最多只会有一个father一个儿子,所以缩边是可行的 ,每次把父子关系链上的所有点的父亲节点都更新为最顶点,
感谢北神
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<cmath>
using namespace std;
const int maxn = 1e5 + 7;
int n, m;
int a[maxn];
int fa[maxn];
int update(int x){
if(fa[x] == x) return x;
int tmp=update(fa[x]);
a[x] = min(a[x], a[fa[x]]);
return fa[x]=tmp;
}
int main(){
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
fa[i] = i;
}
char c;
int u, v;
for(int i = 1; i <= m; ++i){
scanf(" %c", &c);
if(c == '+'){
scanf("%d %d", &u, &v);
fa[v] = u;
update(v);
}
else {
scanf("%d", &u);
update(u);
printf("%d\n", a[u]);
}
}
}