Submission #743673

#TimeUsernameProblemLanguageResultExecution timeMemory
743673Azther0zBridges (APIO19_bridges)C++11
100 / 100
2231 ms32128 KiB
#include <bits/stdc++.h> using namespace std; const int MX=100000; const int BLOCK=1000; int n,m,q; int A[MX+1],B[MX+1],W[MX+1]; int op[MX+1],X[MX+1],Y[MX+1]; int dsu[MX+1],sz[MX+1],result[MX+1]; stack<int> stk; vector<vector<int>> toMerge(BLOCK+1); bitset<MX+1> changed; int find(int x) { while(x!=dsu[x]) x=dsu[x]; return x; } void merge(int x,int y) { x=find(x),y=find(y); if(x==y) return; if(sz[x]<sz[y]) swap(x,y); sz[x]+=sz[y]; dsu[y]=x; stk.push(y); } void rollback(int x) { while(stk.size()>x) { sz[dsu[stk.top()]]-=sz[stk.top()]; dsu[stk.top()]=stk.top(); stk.pop(); } } void reset() { for(int i=1;i<=n;i++) { dsu[i]=i; sz[i]=1; } changed=0; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&A[i],&B[i],&W[i]); scanf("%d",&q); for(int i=1;i<=q;i++) scanf("%d%d%d",&op[i],&X[i],&Y[i]); for(int l=1;l<=q;l+=BLOCK) { int r=min(q+1,l+BLOCK); reset(); vector<int> calc,update,unchanged; for(int i=l;i<r;i++) { if(op[i]==1) { changed[X[i]]=true; update.push_back(i); } else { calc.push_back(i); } } for(int i=1;i<=m;i++) if(!changed[i]) unchanged.push_back(i); for(int i=l;i<r;i++) { if(op[i]==1) { W[X[i]]=Y[i]; } else { toMerge[i-l].clear(); for(auto j:update) if(W[X[j]]>=Y[i]) toMerge[i-l].push_back(X[j]); } } sort(calc.begin(),calc.end(),[&](int a,int b){return Y[a]>Y[b];}); sort(unchanged.begin(),unchanged.end(),[&](int a,int b){return W[a]>W[b];}); int idx=0; for(auto i:calc) { while(idx<unchanged.size()&&W[unchanged[idx]]>=Y[i]) { merge(A[unchanged[idx]],B[unchanged[idx]]); idx++; } int prev=stk.size(); for(auto j:toMerge[i-l]) merge(A[j],B[j]); result[i]=sz[find(X[i])]; rollback(prev); } } for(int i=1;i<=q;i++) if(op[i]==2) printf("%d\n",result[i]); }

Compilation message (stderr)

bridges.cpp: In function 'void rollback(int)':
bridges.cpp:29:18: warning: comparison of integer expressions of different signedness: 'std::stack<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   29 |  while(stk.size()>x)
      |        ~~~~~~~~~~^~
bridges.cpp: In function 'int main()':
bridges.cpp:91:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |    while(idx<unchanged.size()&&W[unchanged[idx]]>=Y[i])
      |          ~~~^~~~~~~~~~~~~~~~~
bridges.cpp:47:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   47 |  scanf("%d%d",&n,&m);
      |  ~~~~~^~~~~~~~~~~~~~
bridges.cpp:49:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |   scanf("%d%d%d",&A[i],&B[i],&W[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:50:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |  scanf("%d",&q);
      |  ~~~~~^~~~~~~~~
bridges.cpp:52:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   52 |   scanf("%d%d%d",&op[i],&X[i],&Y[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...