Submission #674721

#TimeUsernameProblemLanguageResultExecution timeMemory
674721vjudge1Bridges (APIO19_bridges)C++17
100 / 100
2571 ms141200 KiB
#include<bits/stdc++.h> const int Buf=1<<21; char ibuf[Buf],*iS,*iT,obuf[Buf],*oS=obuf,*oT=oS+Buf-1; #define flush() (fwrite(obuf,1,oS-obuf,stdout),oS=obuf,void()) #define getchar() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,Buf,stdin),(iS==iT?EOF:*iS++)):*iS++) #define putchar(x) (*oS++=(x),oS==oT?flush():void()) struct Flusher_{~Flusher_(){flush();}}flusher_; template<class T> inline void read(T &x){ x=0; register char c=getchar(); register bool f=0; while(!isdigit(c))f^=c=='-',c=getchar(); while(isdigit(c))x=x*10+c-'0',c=getchar(); if(f)x=-x; } template<class T> inline void print(T x){ if(x<0)putchar('-'),x=-x; if(x>9)print(x/10); putchar(x%10+'0'); } template<class T> inline void print(T x,char c){print(x),putchar(c);} const int N=1e5+10,M=5e5+10; int n,m,q,S,ans[N],mrk[N],vis[N],anc[N],tmp[M],siz[M],_anc[N],_siz[N]; std::vector<int> ext,sta,lnk[M],vec[N],qry[M]; struct tuple{ int a,b,c; }edg[N],opt[N]; int find(int x){return anc[x]==x?x:anc[x]=find(anc[x]);} int _find(int x){return _anc[x]==x?x:_anc[x]=_find(_anc[x]);} inline void upd(int x){ _anc[x]=find(x); _anc[_anc[x]]=_anc[x],_siz[_anc[x]]=siz[_anc[x]]; } int main(){ #ifdef memset0 freopen("2.in","r",stdin); freopen("2.out","w",stdout); #endif read(n),read(m); for(int u,v,w,i=1;i<=m;i++){ read(u),read(v),read(w); edg[i]={u,v,w}; } read(q); for(int o,x,y,i=1;i<=q;i++){ read(o),read(x),read(y); opt[i]={o,x,y}; tmp[++*tmp]=y; } std::sort(tmp+1,tmp+*tmp+1); *tmp=std::unique(tmp+1,tmp+*tmp+1)-tmp-1; for(int i=1;i<=m;i++)edg[i].c=std::upper_bound(tmp+1,tmp+*tmp+1,edg[i].c)-tmp-1; for(int i=1;i<=q;i++)opt[i].c=std::upper_bound(tmp+1,tmp+*tmp+1,opt[i].c)-tmp-1; S=std::max(1,std::min(q,(int)(sqrt(q)*3))); for(int l=1,r=S;l<=q;l=r+1,r=std::min(q,r+S)){ for(int i=l;i<=r;i++)if(opt[i].a==1)mrk[opt[i].b]=true; for(int i=1;i<=m;i++)(mrk[i]?ext:sta).push_back(i); for(int i=l;i<=r;i++)if(opt[i].a==1){ edg[opt[i].b].c=opt[i].c; }else{ for(int e:ext)if(edg[e].c>=opt[i].c)vec[i].push_back(e); qry[opt[i].c].push_back(i); } for(int e:sta)lnk[edg[e].c].push_back(e); for(int i=1;i<=n;i++)anc[i]=i,siz[i]=1; for(int i=*tmp;i>=1;i--){ for(int e:lnk[i]){ int a=find(edg[e].a),b=find(edg[e].b); if(a!=b){ if(siz[a]>siz[b])std::swap(a,b); anc[a]=b; siz[b]+=siz[a]; } } for(int o:qry[i]){ upd(opt[o].b); for(int e:ext)upd(edg[e].a),upd(edg[e].b); for(int e:vec[o]){ int a=_find(edg[e].a),b=_find(edg[e].b); if(a!=b){ if(siz[a]>siz[b])std::swap(a,b); _anc[a]=b; _siz[b]+=_siz[a]; } } ans[o]=_siz[_find(opt[o].b)]; } } for(int e:sta)lnk[edg[e].c].clear(); for(int i=l;i<=r;i++)if(opt[i].a==1)mrk[opt[i].b]=false; for(int i=l;i<=r;i++)if(opt[i].a==2)qry[opt[i].c].clear(); ext.clear(),sta.clear(); } for(int i=1;i<=q;i++)if(opt[i].a==2)print(ans[i],'\n'); fprintf(stderr,"clocks: %.4lf\n",clock()/(double)CLOCKS_PER_SEC); }

Compilation message (stderr)

bridges.cpp: In function 'void read(T&)':
bridges.cpp:8:21: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
    8 |  x=0; register char c=getchar(); register bool f=0;
      |                     ^
bridges.cpp:8:48: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
    8 |  x=0; register char c=getchar(); register bool f=0;
      |                                                ^
bridges.cpp:10:2: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
   10 |  while(isdigit(c))x=x*10+c-'0',c=getchar(); if(f)x=-x;
      |  ^~~~~
bridges.cpp:10:45: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
   10 |  while(isdigit(c))x=x*10+c-'0',c=getchar(); if(f)x=-x;
      |                                             ^~
bridges.cpp: In instantiation of 'void read(T&) [with T = int]':
bridges.cpp:34:8:   required from here
bridges.cpp:8:21: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
    8 |  x=0; register char c=getchar(); register bool f=0;
      |                     ^
bridges.cpp:8:48: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
    8 |  x=0; register char c=getchar(); register bool f=0;
      |                                                ^
#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...