Advertisement
SuitNdtie

o25_ringroad

Oct 13th, 2019
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long int ll;
  4.  
  5. int const K = 200010;
  6. ll seg[4*K];
  7. int k = 0;
  8.  
  9. void update(int idx,ll diff,int p = 1,int b = 1,int e = k){
  10.     if(idx < b || idx > e)return;
  11.     seg[p] += diff;
  12.    
  13.     if(b == e)return;
  14.     int m = (b+e)/2;
  15.     update(idx,diff,p*2,b,m);
  16.     update(idx,diff,p*2+1,m+1,e);
  17.     seg[p] = seg[p*2] + seg[p*2+1];
  18. }
  19.  
  20. ll query(int l,int r,int p = 1,int b = 1,int e = k){
  21.     if(r < b || l > e)return 0;
  22.     if(l <= b && e <= r)return seg[p];
  23.     int m = (b+e)/2;
  24.     return query(l,r,p*2,b,m) + query(l,r,p*2+1,m+1,e);
  25. }
  26.  
  27. int main()
  28. {
  29.     //freopen("input.txt","r",stdin);
  30.     int n,Q;
  31.     scanf("%d %d %d",&n,&k,&Q);
  32.    
  33.     ll MinDist[n+1];
  34.     int MainIdx[n+1];
  35.     ll MainRoad[k+1];
  36.     ll SumMainRoad = 0;
  37.     for(int i = 1 ; i <= n ; i ++){
  38.         if(i <= k){ //Main station
  39.             ll value;
  40.             scanf("%lld",&value);
  41.             MainRoad[i] = value;
  42.             SumMainRoad += value;
  43.             MinDist[i] = 0;
  44.             MainIdx[i] = i;
  45.             update(i,value);
  46.         }
  47.         else{ // Sub station
  48.             int next;
  49.             ll value;
  50.             scanf("%d %lld",&next,&value);
  51.             MainIdx[i] = MainIdx[next];
  52.             MinDist[i] = MinDist[next] + value;
  53.         }
  54.     }
  55.     for(int q = 0 ; q < Q ; q ++){
  56.         int op;
  57.         scanf("%d",&op);
  58.         if(op == 1){ //Query
  59.             int x,y;
  60.             scanf("%d %d",&x,&y);
  61.             if(MainIdx[x] > MainIdx[y])swap(x,y);
  62.             if(MainIdx[x] == MainIdx[y])printf("%lld\n",abs(MinDist[x]-MinDist[y])); //Co-Main
  63.             else{
  64.             //  printf("Test query(%d,%d)\n",MainIdx[x],MainIdx[y]-1);
  65.                 ll Direct = query(MainIdx[x],MainIdx[y]-1);
  66.             //  printf("SumMainRoad = %lld , Direct = %lld ,Sum = %lld + %lld + %lld = ",SumMainRoad,Direct,MinDist[x],min(SumMainRoad - Direct,Direct),MinDist[y]);
  67.                 printf("%lld\n",MinDist[x] + min(SumMainRoad - Direct,Direct) + MinDist[y]);
  68.             }
  69.         }
  70.         else if(op == 0){ //Update
  71.             int idx;
  72.             ll value;
  73.             scanf("%d %lld",&idx,&value);
  74.             update(idx,value - MainRoad[idx]);
  75.             SumMainRoad += value - MainRoad[idx];
  76.             MainRoad[idx] = value;
  77.         }
  78.     }
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement