Submission #136777

#TimeUsernameProblemLanguageResultExecution timeMemory
136777KLPPBridges (APIO19_bridges)C++14
29 / 100
3097 ms16668 KiB
#include<bits/stdc++.h>

using namespace std;
typedef long long int lld;
typedef pair<lld,lld> pii;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define trav(a,v) for(auto a:v)
class ST{
  lld arr[400000];
  lld mid[400000];
public:
  void build(int a, int b, int node){
    if(a==b){
      arr[node]=0;
      return;
    }
    mid[node]=(a+b)/2;
    build(a,mid[node],2*node);
    build(mid[node]+1,b,2*node+1);
    arr[node]=min(arr[2*node],arr[2*node+1]);
    //delete(&mid);
  }
  void update(int a, int b, int node, int pos, lld val){
    if(pos<a || b<pos)return;
    if(a==b){
      arr[node]=val;
      return;
    }
    
    update(a,mid[node],2*node,pos,val);
    update(mid[node]+1,b,2*node+1,pos,val);
    arr[node]=min(arr[2*node],arr[2*node+1]);
    //delete(&mid);
  }
  lld query(int a, int b, int node, int x, int y){
    if(b<x || y<a)return 1000000000000;
    if(x<=a && b<=y)return arr[node];
    return min(query(a,mid[node],2*node,x,y),query(mid[node]+1,b,2*node+1,x,y));
  }
  
  void print(int a, int b, int node){
    cout<<a<<" "<<b<<" "<<arr[node]<<endl;
    if(a==b)return;
    int mid=(a+b)/2;
    print(a,mid,2*node);
    print(mid+1,b,2*node+1);
  }
};
class DSU{
  int parent[1000000];
  int size[1000000];
public:
  void init(int N){
    rep(i,0,N){
      parent[i]=i;
      size[i]=1;
    }
  }
  int root(int node){
    if(parent[node]==node)return node;
    parent[node]=root(parent[node]);
    return parent[node];
  }
  void merge(int a, int b){
    a=root(a);
    b=root(b);
    if(a==b)return;
    if(size[a]<size[b])swap(a,b);
    parent[b]=a;
    size[a]+=size[b];
  }
  int SZ(int node){
    return size[root(node)];
  }
  void print(){
    for(int i=0;i<10;i++)cout<<parent[i]<<endl;
  }
};
int main(){
  
  int n,m,q;
  cin>>n>>m;
  ST S;
  lld edgelist[m][3];
  rep(i,0,m){
    rep(j,0,3){
      cin>>edgelist[i][j];
      if(j<2)edgelist[i][j]--;
    }
  }
  cin>>q;
  if(m*q<=10000000){
    while(q--){
      int type;
      cin>>type;
      if(type==1){
	int num;
	lld val;
	cin>>num>>val;
	num--;
	edgelist[num][2]=val;
      }else{
	int start;
	lld w;
	cin>>start>>w;
	start--;
	vector<int> nei[n];
	bool visited[n];
	rep(i,0,n)visited[i]=false;
	//cout<<start<<endl;
	rep(i,0,m){
	  if(edgelist[i][2]>=w){
	    //cout<<edgelist[i][0]<<" "<<edgelist[i][1]<<endl;
	    nei[edgelist[i][0]].push_back(edgelist[i][1]);
	    nei[edgelist[i][1]].push_back(edgelist[i][0]);
	  }
	}
	queue<int> q;
	q.push(start);
	visited[start]=true;
	while(!q.empty()){
	  int u=q.front();q.pop();
	  trav(v,nei[u]){
	    if(!visited[v]){
	      visited[v]=true;
	      q.push(v);
	    }
	  }
	}
	lld ans=0;
	rep(i,0,n)ans+=visited[i];
	cout<<ans<<endl;
      }
    }
    return 0;
  }
  bool chain=(m==n-1);
  rep(i,0,m){
    if(edgelist[i][0]!=i || edgelist[i][1]!=i+1)chain=false;
  }
  int t,pos,start,hi,lo,mid;
  lld val,weight,ans;
  if(chain){
    S.build(0,n-2,1);
    rep(i,0,n-1){
      S.update(0,n-2,1,i,edgelist[i][2]);
    }
    while(q--){
      
      cin>>t;
      if(t==1){
	
	cin>>pos>>val;
	pos--;
	S.update(0,n-2,1,pos,val);
      }else{
	
	cin>>start>>weight;
	start--;
	ans=0;
	
	if(start>0){
	  hi=start;
	  lo=-1;
	  while(hi-lo>1){
	    int mid=(hi+lo)/2;
	    if(S.query(0,n-2,1,mid,start-1)<weight)lo=mid;
	    else hi=mid;
	  }
	  ans+=start-hi;
	}
	if(start<n-1){
	  
	  hi=n-1;
	  lo=start-1;
	  while(hi-lo>1){
	    mid=(hi+lo)/2;
	    if(S.query(0,n-2,1,start,mid)<weight)hi=mid;
	    else lo=mid;
	  }
	  ans+=lo-(start-1);
	}
	cout<<ans+1<<endl;
      }
    }
    return 0;
  }
  vector<pair<lld,pii> > V;
  rep(i,0,m){
    V.push_back(pair<lld,pii>(edgelist[i][2]+1,pii(-edgelist[i][0],-edgelist[i][1])));
  }
  lld answers[q+1];
  rep(i,0,q){
    int type;
    scanf("%d",&type);
    int start;
    lld w;
    scanf("%d %lld",&start,&w);
    start--;
    V.push_back(pair<lld,pii>(w,pii(i+1,start)));
  }
  sort(V.begin(),V.end());
  reverse(V.begin(),V.end());
  DSU *D=new DSU();
  D->init(n);
  rep(i,0,V.size()){
    if(V[i].second.first<=0){//UPD
      //cout<<"U"<<endl;
      D->merge(-V[i].second.first,-V[i].second.second);
    }else{//Q
      //out<<"Q"<<endl;
      //D->print();
      answers[V[i].second.first]=D->SZ(V[i].second.second);
    }
  }
  rep(i,1,q+1)printf("%lld\n",answers[i]);
  return 0;
}

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:6:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define rep(i,a,b) for(int i=a;i<b;i++)
bridges.cpp:206:7:
   rep(i,0,V.size()){
       ~~~~~~~~~~~~               
bridges.cpp:206:3: note: in expansion of macro 'rep'
   rep(i,0,V.size()){
   ^~~
bridges.cpp:195:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&type);
     ~~~~~^~~~~~~~~~~~
bridges.cpp:198:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %lld",&start,&w);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...