#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
const int N=1e5+50,M=50050,S=340;
array<int,3>edges[N],Qs[N];
int par[M],sajz[M];
//vector<pair<int,int>>undo;
void DSU(){for(int i=0;i<M;i++)par[i]=0,sajz[i]=1;}
int FS(int u){if(par[u]==0)return u;return par[u]=FS(par[u]);}
bool US(int u,int v){
u=FS(u),v=FS(v);
if(u==v) return 0;
if(sajz[u]<sajz[v])swap(u,v);
par[v]=u;
sajz[u]+=sajz[v];
//undo.pb({u,v});
return 1;
}
/*void Undo(){
auto [u,v]=undo.back();undo.pop_back();
sajz[u]-=sajz[v];
par[v]=0;
}*/
void Clear(){DSU();}//{while(!undo.empty())Undo();}
vector<int>E[N];
bool was[N];
int DFS(int u){
//printf("* %i\n",u);
int res=sajz[u];
was[u]=true;
for(auto i:E[u])if(!was[i])res+=DFS(i);
return res;
}
bool skip[N];
set<pair<int,int>>st;
int main(){
DSU();
int n,m;scanf("%i%i",&n,&m);
for(int i=1;i<=m;i++){
int u,v,w;scanf("%i%i%i",&u,&v,&w);
edges[i]={w,u,v};
st.insert({w,i});
}
int q;scanf("%i",&q);
for(int i=0;i<q;i++){
int type,u,v;scanf("%i%i%i",&type,&u,&v);
Qs[i]={type,u,v};
}
vector<int>res;
for(int B=0;B*S<q;B++){
int l=B*S,r=min(q-1,B*S+S-1);
vector<array<int,4>>upd,qs;
vector<array<int,3>>grane;
vector<int>ans;
int qcnt=0;
qs.reserve(r-l+1);
upd.reserve(r-l+1);
for(int i=l;i<=r;i++){
auto [type,u,v]=Qs[i];
if(type==1) skip[u]=true;
else qs.pb({v,u,qcnt++,i});
}
for(auto [w,i]:st){
if(skip[i]) upd.pb({edges[i][0],edges[i][1],edges[i][2],i});
else grane.pb(edges[i]);
}
//sort(grane.begin(),grane.end());
sort(qs.begin(),qs.end());
ans.resize(qcnt);
for(int i=qcnt-1,j=(int)grane.size()-1;i>=0;i--){
while(j>=0&&grane[j][0]>=qs[i][0]){
US(grane[j][1],grane[j][2]);
j--;
}
int undocnt=0;
for(int k=l;k<=qs[i][3];k++){
auto [type,u,v]=Qs[k];
if(type==1) edges[u][0]=v;
}
vector<int>vts;
for(auto [w,u,v,j]:upd){
if(edges[j][0]>=qs[i][0]){
//undocnt+=US(u,v);
int u1=FS(u),v1=FS(v);
E[u1].pb(v1);
E[v1].pb(u1);
vts.pb(u1),vts.pb(v1);
}
edges[j][0]=w;
}
//for(int i=1;i<=n;i++)printf("%i ",was[i]==1?1:0);printf("\n");
ans[qs[i][2]]=DFS(FS(qs[i][1]));
//for(int i=1;i<=n;i++)printf("%i ",sajz[i]);printf("\n");
//for(int i=1;i<=n;i++)printf("%i ",was[i]==1?1:0);printf("\n");
//printf("vts: ");for(auto u:vts)printf("%i ",u);printf("\n");
for(auto u:vts)was[u]=false,E[u].clear();
was[FS(qs[i][1])]=false;
//ans[qs[i][2]]=sajz[FS(qs[i][1])];
//while(undocnt--) Undo();
}
for(auto i:ans) res.pb(i);
for(int i=l;i<=r;i++){
auto [type,u,v]=Qs[i];
if(type==1){
st.erase({edges[u][0],u});
edges[u][0]=v;
st.insert({edges[u][0],u});
skip[u]=false;
}
}
Clear();
}
for(auto i:res) printf("%i\n",i);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
bridges.cpp: In function 'int main()':
bridges.cpp:46:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
46 | int n,m;scanf("%i%i",&n,&m);
| ~~~~~^~~~~~~~~~~~~~
bridges.cpp:48:24: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
48 | int u,v,w;scanf("%i%i%i",&u,&v,&w);
| ~~~~~^~~~~~~~~~~~~~~~~~~
bridges.cpp:52:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
52 | int q;scanf("%i",&q);
| ~~~~~^~~~~~~~~
bridges.cpp:54:27: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
54 | int type,u,v;scanf("%i%i%i",&type,&u,&v);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |