开数组开了101MB。
#include<bits/stdc++.h>
using namespace std;
char a;
int n,m,op,x,y,q,cnt,tot,li,g[1000005],cnt2,anc[800005][21],sz[1000005],lg,to[1000005],val[1000005],last[1000005];
int dfn(int x)
{
return (x==g[x]?x:g[x]=dfn(g[x]));
}
struct Edge
{
int u,v,k,id;
} edge[1000005];
struct EDge
{
int to,pre;
} e[400005];
char b;
void add(int u,int v)
{
e[++cnt].to=v;
e[cnt].pre=last[u];
last[u]=cnt;
}
bool cmp(Edge x,Edge y)
{
return x.k>y.k;
}
void dfs(int now)
{
for(int i=1;i<=lg+1;i++)
{
anc[now][i]=anc[anc[now][i-1]][i-1];
}
if(now<=n)
{
sz[now]=1;
return;
}
for(int i=last[now];i;i=e[i].pre)
{
int to=e[i].to;
if(sz[to])
{
continue;
}
anc[to][0]=now;
dfs(to);
sz[now]+=sz[to];
}
}
int main()
{
cin>>n>>m>>q;
cnt2=n;
lg=log2(n);
for(int i=1;i<=n;i++)
{
g[i]=i;
}
for(int i=1;i<=m;i++)
{
cin>>edge[i].u>>edge[i].v>>edge[i].k;
edge[i].id=i;
}
sort(edge+1,edge+m+1,cmp);
for(int i=1;i<=m;i++)
{
int du=dfn(edge[i].u),dv=dfn(edge[i].v);
if(du==dv)
{
continue;
}
g[++cnt2]=g[du]=g[dv]=cnt2;
add(cnt2,du),add(cnt2,dv);
to[edge[i].id]=cnt2;
val[cnt2]=edge[i].k;
tot++;
if(tot==n-1)
{
break;
}
}
for(int i=cnt2;i>=1;i--)
{
if(!sz[i])
{
dfs(i);
}
}
while(q--)
{
cin>>op>>x;
if(op==1)
{
li=x;
}
else if(op==2)
{
for(int i=lg+1;i>=0;i--)
{
if(anc[x][i] && val[anc[x][i]]>=li)
{
x=anc[x][i];
}
}
cout<<sz[x]<<"\n";
}
else
{
cin>>y;
val[to[x]]=y;
}
}
//cout<<(&b-&a)/1024/1024;
return 0;
}