在CF上交,第7个点是RE
在洛谷上交,第7个点WA。。。
/*将每条边删去的时间戳记为这条边的权值,
如果将边权从大到小(即在时间上从后往前)建起Kruskal重构树的话,
每个子树都代表着一个时间点上的联通块*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=5e5+5;
struct Edge{
int v,nxt;
}edge[N];
struct Data{
int u,v,w;
}e[300005];
struct Que{
int tp,x;
}que[500005];
int fa[N];
bool vis[N];
int cnt,head[N],tot,val[N],dfn[N],ind,rnd[N],sz[N],dep[N],f[N][22];
struct Seg{
int maxn,node;
}t[N*4];
int n,m,q,p[200005];
bool cmp(Data a,Data b){
return a.w>b.w;
}
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void add(int u,int v){
edge[++cnt].v=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
void dfs(int u){
dfn[u]=++ind;
rnd[ind]=u;
sz[u]=1;
vis[u]=1;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v;
if(vis[v]) continue;
f[v][0]=u;
dep[v]=dep[u]+1;
dfs(v);
sz[u]+=sz[v];
}
}
int jump(int x,int idx){
for(int i=19;i>=0;i--)
if(val[f[x][i]]>idx) x=f[x][i];
return x;
}
void build(int u,int l,int r){
if(l==r){
t[u].maxn=p[rnd[l]];
t[u].node=rnd[l];
return;
}
int mid=(l+r)/2;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
if(t[u<<1].maxn<t[u<<1|1].maxn) t[u]=t[u<<1|1];
else t[u]=t[u<<1];
}
void update(int u,int l,int r,int x){
if(l==r){
t[u].maxn=0;
return;
}
int mid=(l+r)/2;
if(x<=mid) update(u<<1,l,mid,x);
else update(u<<1|1,mid+1,r,x);
if(t[u<<1].maxn<t[u<<1|1].maxn) t[u]=t[u<<1|1];
else t[u]=t[u<<1];
}
Seg query(int u,int l,int r,int a,int b){
if(a<=l&&r<=b) return t[u];
int mid=(l+r)/2;
Seg ret1,ret2;
ret1.maxn=0;ret1.node=0;
ret2.maxn=0;ret2.node=0;
if(a<=mid) ret1=query(u<<1,l,mid,a,b);
if(mid<b) ret2=query(u<<1|1,mid+1,r,a,b);
if(ret1.maxn<=ret2.maxn) return ret2;
else return ret1;
}
int main(){
scanf("%d%d%d",&n,&m,&q);tot=n;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=n;i++) scanf("%d",&p[i]);
for(int i=1;i<=m;i++){
scanf("%d%d",&e[i].u,&e[i].v);
e[i].w=q+1;
}
for(int i=1;i<=q;i++){
scanf("%d%d",&que[i].tp,&que[i].x);
if(que[i].tp==2) e[que[i].x].w=i;
}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++) val[i]=q+1;
for(int i=1;i<=m;i++){
int fu=find(e[i].u),fv=find(e[i].v);
if(fu!=fv){
tot++;fa[tot]=tot;
val[tot]=e[i].w;
add(tot,fu);
add(tot,fv);
fa[fu]=tot;fa[fv]=tot;
}
}
for(int i=1;i<=tot;i++)
if(find(i)==i) dfs(i);//不要用if(!vis[i]),是find(i)非fa[i]
for(int j=1;j<=19;j++){//j套外层
for(int i=1;i<=tot;i++){
//if(dep[i]<(1<<j)) continue;(可不写)
f[i][j]=f[f[i][j-1]][j-1];
}
}
build(1,1,tot);
for(int i=1;i<=q;i++){
if(que[i].tp==1){
int u=jump(que[i].x,i);
Seg ans=query(1,1,tot,dfn[u],dfn[u]+sz[u]-1);
if(ans.node) update(1,1,tot,dfn[ans.node]);
printf("%d\n",ans.maxn);
}
}
return 0;
}