代码:
#include<iostream>
#include<algorithm>
#include<map>
#define int long long
using namespace std;
struct st{
int son[3],par,val;
int sum,tag,siz;
}tr[200005];
struct nod{
int u,v,a,b;
bool operator<(nod x)const{
if(a!=x.a)return a<x.a;
return b<x.b;
}
}edge[100005];
int f[100005];
int fd(int x){
if(x==f[x])return x;
return f[x]=fd(f[x]);
}
void puta(int u){
swap(tr[u].son[0],tr[u].son[1]);
tr[u].tag^=1;
}
void pushup(int u){
int lc=tr[u].son[0],rc=tr[u].son[1];
tr[u].sum=tr[u].val;
if(lc && tr[lc].sum>tr[u].sum)tr[u].sum=tr[lc].sum;
if(rc && tr[rc].sum>tr[u].sum)tr[u].sum=tr[rc].sum;
}
void pushdown(int u){
if(tr[u].tag)puta(tr[u].son[0]),puta(tr[u].son[1]);
tr[u].tag=0;
}
bool isro(int u){
return tr[tr[u].par].son[0]!=u && tr[tr[u].par].son[1]!=u;
}
void rotate(int u){
int f=tr[u].par,g=tr[f].par;
int k=tr[f].son[1]==u;
if(!isro(f))tr[g].son[tr[g].son[1]==f]=u;
tr[u].par=g;
tr[f].son[k]=tr[u].son[k^1],tr[tr[u].son[k^1]].par=f;
tr[u].son[k^1]=f,tr[f].par=u;
pushup(f),pushup(u);
}
int sta[100005];
void splay(int u){
int top=0,roo=u;
sta[++top]=u;
while(!isro(roo))sta[++top]=roo=tr[roo].par;
while(top)pushdown(sta[top--]);
while(!isro(u)){
int f=tr[u].par,g=tr[f].par;
if(!isro(f)){
if((tr[f].son[1]==u)^(tr[g].son[1]==f))rotate(u);
else rotate(f);
}
rotate(u);
}
}
void access(int u){
int b=u;
for(int v=0;u;v=u,u=tr[u].par){
splay(u);
tr[u].son[1]=v,pushup(u);
}
splay(b);
}
void makeroot(int u){access(u);puta(u);}
int findroot(int u){
access(u);
while(tr[u].son[0])pushdown(u),u=tr[u].son[0];
splay(u);
return u;
}
void split(int u,int v){makeroot(u);access(v);}
void link(int u,int v){
makeroot(u);
if(findroot(v)!=u)tr[u].par=v,tr[u].siz++,tr[v].siz++;
}
void cut(int u,int v){
makeroot(u);
if(findroot(v)==u && tr[v].par==u && !tr[v].son[0]){
tr[u].son[0]=tr[v].par=tr[v].val=0;
pushup(u);
}
}
map<int,int> mp[100005];
signed main(){
cin.tie(0);cout.tie(0);
ios::sync_with_stdio(false);
int n,m,c,k;
cin>>n>>m>>c>>k;
for(int i=1;i<=n;i++){
int v;
cin>>v;
for(int j=0;j<c;j++){
tr[j*n+i].val=v;
}
}
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
link(w*n+u,w*n+v);
mp[u][v]=mp[v][u]=w;
}
while(k--){
int op;
cin>>op;
if(op==0){
int x,y;
cin>>x>>y;
for(int i=0;i<c;i++){
splay(x+i*n);
tr[x+i*n].val=y;
pushup(x+i*n);
}
}
else if(op==1){
int u,v,w;
cin>>u>>v>>w;
if(!mp[u].count(v)){
cout<<"No such edge."<<endl;
continue;
}
int id=mp[u][v],x=u+id*n,y=v+id*n;
if(id==w){
cout<<"Success."<<endl;
continue;
}
if(tr[w*n+u].siz==2 || tr[w*n+v].siz==2){
cout<<"Error 1."<<endl;
continue;
}
makeroot(w*n+u);
if(findroot(w*n+v)==w*n+u){
cout<<"Error 2."<<endl;
continue;
}
cout<<"Success."<<endl;
cut(x,y);
link(w*n+u,w*n+v);
mp[u][v]=mp[v][u]=w;
}
else{
int c,u,v;
cin>>c>>u>>v;
u=c*n+u,v=c*n+v;
makeroot(u);
if(findroot(v)!=u){
cout<<-1<<endl;
continue;
}
split(u,v);
cout<<tr[v].sum<<endl;
}
}
}