제출 #708541

#제출 시각아이디문제언어결과실행 시간메모리
708541EthanKim8683다리 (APIO19_bridges)C++17
0 / 100
3028 ms5044 KiB
#include<bits/stdc++.h>
using namespace std;
using I=int;
using B=bool;
const I N=50000;
const I M=100000;
const I Q=100000;
const I MIN=-1e9;
pair<I,I>edgs[M];
I d_arr[M];
I tmps[M];
tuple<I,I,I>qrys[Q];
I pars[N];
I inds[M];
I ress[Q];
set<I>acts;
priority_queue<pair<I,I>>ques;
map<I,map<I,I>>adjs;
I viss[N];
I tim=1;
B cmp(I a,I b){
  return tmps[a]>tmps[b];
}
I fnd(I i){
  return pars[i]<0?i:fnd(pars[i]);
}
void uni(I a,I b){
  if((a=fnd(a))==(b=fnd(b)))return;
  if(pars[a]>pars[b])swap(a,b);
  pars[a]+=pars[b],pars[b]=a;
}
I siz(I i){
  return-pars[fnd(i)];
}
I dfs(I a,I w){
  if(viss[a]==tim)return 0;
  viss[a]=tim;
  I res=siz(a);
  for(auto[b,r]:adjs[a])if(r>=w)res+=dfs(b,w);
  return res;
}
void slv(I d){
  while(ques.size()&&ques.top().first>d){
    I i=ques.top().second;ques.pop();
    auto[t,s,w]=qrys[i];
    adjs.clear();
    for(auto j:acts){
      auto[u,v]=edgs[j];
      u=fnd(u),v=fnd(v);
      if(u==v)continue;
      adjs[u][v]=adjs[v][u]=d_arr[j];
    }
    for(I j=0;j<i;j++){
      auto[t,b,r]=qrys[j];
      if(t!=1)continue;
      auto[u,v]=edgs[b];
      u=fnd(u),v=fnd(v);
      if(u==v)continue;
      adjs[u][v]=adjs[v][u]=r;
    }
    ress[i]=dfs(fnd(s),w),tim++;
  }
}
I main(){
  cin.tie(0)->sync_with_stdio(0);
  I n,m;cin>>n>>m;
  for(I i=0;i<m;i++){
    I u,v,d;cin>>u>>v>>d,u--,v--;
    edgs[i]={u,v};
    d_arr[i]=d;
  }
  I q;cin>>q;
  I siz=sqrt(q);
  iota(inds,inds+m,0);
  for(I i=0;i<(q+siz-1)/siz;i++){
    I upp=min(siz,q-i*siz);
    acts.clear();
    copy_n(d_arr,m,tmps);
    for(I j=0;j<upp;j++){
      I t;cin>>t;
      if(t==1){
        I b,r;cin>>b>>r,b--;
        qrys[j]={1,b,r};
        tmps[b]=MIN;
        acts.insert(b);
      }
      if(t==2){
        I s,w;cin>>s>>w,s--;
        qrys[j]={2,s,w};
        ques.push({w,j});
      }
    }
    sort(inds,inds+m,cmp);
    fill_n(pars,n,-1);
    for(I j=0;j<m;j++){
      I k=inds[j];
      slv(tmps[k]);
      auto[u,v]=edgs[k];
      uni(u,v);
    }
    slv(MIN);
    for(I j=0;j<upp;j++){
      auto[t,b,r]=qrys[j];
      if(t==1)d_arr[b]=r;
      if(t==2)printf("%i\n",ress[j]);
    }
  }
}
#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...