或许有人能帮我看看代码
#include<bits/stdc++.h>
using namespace std;
int read()
{
char c;
int w=1;
while((c=getchar())>'9'||c<'0')if(c=='-')w=-1;
int ans=c-'0';
while((c=getchar())>='0'&&c<='9')ans=(ans<<1)+(ans<<3)+c-'0';
return ans*w;
}
int n,m,q;
int cst;
int ans[300005];
struct node
{
int a,b,c;
}e[2000005];
int fa[300005];
int findf(int x)
{
return fa[x]==x?x:fa[x]=findf(fa[x]);
}
map <pair<int,int>,int> mm;
int w[300005][4];
bool cmp(node x,node y)
{
return x.c<y.c;
}
int size[300005];
int maxx[300005][2];
int c[300005][2];
int val[300005];
int uu[300005];
int vv[300005];
int rev[300005];
int f[300005];
void ph(int x)
{
maxx[x][0]=val[x];
maxx[x][1]=x;
if(maxx[c[x][0]][0]>maxx[x][0])
{
maxx[x][0]=maxx[c[x][0]][0];
maxx[x][1]=maxx[c[x][0]][1];
}
if(maxx[c[x][1]][0]>maxx[x][0])
{
maxx[x][0]=maxx[c[x][1]][0];
maxx[x][1]=maxx[c[x][1]][1];
}
}
int nroot(int x)
{
return (c[f[x]][0]==x)||(c[f[x]][1]==x);
}
void rotate(int x)
{
int y=f[x],z=f[y],s=c[y][1]==x;
c[y][s]=c[x][!s];f[c[x][!s]]=y;
f[x]=z;if(nroot(y))c[z][c[z][1]==y]=x;
f[c[x][!s]=y]=x;ph(y);ph(x);
}
int rv(int x)
{
if(x)swap(c[x][0],c[x][1]),rev[x]^=1;
}
void pd(int x)
{
if(rev[x])rv(c[x][0]),rv(c[x][1]),rev[x]=0;
}
void pds(int x)
{
if(nroot(x))pds(f[x]);
pd(x);
}
void splay(int x)
{
pds(x);
while(nroot(x))
{
int y=f[x];
int z=f[y];
if(nroot(y))
{
if((c[z][1]==y)==(c[y][1]==x))rotate(y);
else rotate(x);
}
rotate(x);
}
}
void access(int x)
{
for(int y=0;x;x=f[y=x])
{
splay(x);
c[x][1]=y;
ph(x);
}
}
void evert(int x)
{
access(x);
splay(x);
rv(x);
}
void link(int x,int y)
{
evert(x);
f[x]=y;
}
void cut(int x,int y)
{
evert(x);
access(y);
splay(x);
f[y]=c[x][1]=0;
ph(x);
}
int main(){
// system("fc P4172_2.out b.out");
// freopen("P4172_2.in","r",stdin);
// freopen("b.out","w",stdout);
n=read();
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
m=read();
q=read();
for(int i=1;i<=m;i++)
{
e[i].a=read();
e[i].b=read();
if(e[i].a>e[i].b)swap(e[i].a,e[i].b);
e[i].c=read();
mm[make_pair(e[i].a,e[i].b)]=i;
}
for(int i=1;i<=q;i++)
{
w[i][0]=read();
w[i][1]=read();
w[i][2]=read();
if(w[i][1]>w[i][2])swap(w[i][1],w[i][2]);
if(w[i][0]==2)
{
int www=mm[make_pair(w[i][1],w[i][2])];
w[i][3]=e[www].c;
e[www].a=0;
e[www].b=0;
e[www].c=0;
}
}
sort(e+1,e+m+1,cmp);
int cnts=n;
for(int i=1;i<=m;i++)
{
int a,b,c;
a=e[i].a;
b=e[i].b;
c=e[i].c;
// cout<<c<<endl;
if(e[i].a==e[i].b&&e[i].a==0)
{
continue;
}
a=findf(a);
b=findf(b);
if(a!=b)
{
fa[b]=a;
++cnts;
// cout<<e[i].a<<" "<<e[i].b<<" "<<e[i].c<<endl;
uu[cnts]=e[i].a;
vv[cnts]=e[i].b;
// cout<<cnts<<endl;
// cout<<uu[cnts]<<" "<<vv[cnts]<<endl;
val[cnts]=e[i].c;
link(cnts,e[i].a);
link(cnts,e[i].b);
}
}
for(int i=q;i>=1;i--)
{
if(w[i][0]==2)
{
int a,b,c;
a=w[i][1];
b=w[i][2];
c=w[i][3];
evert(a);
access(b);
splay(b);
if(maxx[b][0]>c)
{
// cout<<maxx[b][1]<<endl;
// cout<<uu[maxx[b][1]]<<" "<<vv[maxx[b][1]]<<endl;
cut(maxx[b][1],uu[maxx[b][1]]);
cut(maxx[b][1],vv[maxx[b][1]]);
++cnts;
uu[cnts]=a;
vv[cnts]=b;
val[cnts]=c;
link(cnts,a);
link(cnts,b);
}
}
if(w[i][0]==1)
{
int a,b;
a=w[i][1];
b=w[i][2];
evert(a);
access(b);
splay(b);
ans[++cst]=maxx[b][0];
}
}
for(int i=cst;i>=1;i--)
{
printf("%d\n",ans[i]);
}
return 0;
}
oj wa
luogu不知为何MLE(我没开爆呀QWQ)