Advertisement
omar-alhelo

Untitled

Aug 10th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.62 KB | None | 0 0
  1. /// __Macro's__
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define ll                   long long
  5. #define II                   pair<int,int>
  6. #define III                  pair<int, II>
  7. #define VL                   vector<ll>
  8. #define VI                   vector<int>
  9. #define VII                  vector<II>
  10. #define VIII                 vector<III>
  11. #define VVI                  vector<vector<int>>
  12. #define VVII                 vector<vector<II>>
  13. #define fr                   first
  14. #define sc                   second
  15. #define mkpr                 make_pair
  16. #define PQ                   priority_queue
  17. #define pb                   push_back
  18. #define eb                   emplace_back
  19. #define all(v)               v.begin(), v.end()
  20. #define LINE                 putc('\n', stdout)
  21. #define SPACE                putc(' ' , stdout)
  22. #define TAB                  putc('\t', stdout)
  23. #define fillarr(arr, val)    fill((int*)arr, (int*)arr+(sizeof(arr)/sizeof(int)), val)
  24. #define Log2(x)              (31^__builtin_clz(x))
  25. #define INF                  1000000007
  26. #define MOD                  1000000007
  27. #define getint ReadInt()
  28. const char IO_MODE = 0; // in-->00<--out (MSB-->LSB) | 0: Norm, 1: Fast
  29. inline ll ReadInt(){ll x=0,s=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')s=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';
  30. c=getchar();}return s*x;}inline void WriteInt(ll x){char c[20];if(!x){putchar('0');return;}if(x<0)putchar('-'),x=-x;int i=0;while(x>0)
  31. c[++i]=x%10,x/=10;while(i)putchar(c[i--]+48);}template <typename T>inline void out(T x){if(IO_MODE&1)WriteInt(x);else if(typeid(x)==typeid(int))
  32. printf("%i", x);else printf("%lld", (ll)x);}template<typename T, typename... Args>inline void out(T x,Args...args){out(x);SPACE;out(args...);}
  33. template <typename T>inline void in(T &x){if(IO_MODE&2) x=ReadInt();else if(typeid(x)==typeid(int))scanf("%i",&x);else if(typeid(x)==typeid(ll))
  34. scanf("%lld",&x);}template<typename T, typename... Args>inline void in(T &x,Args&...args){in(x);in(args...);}
  35. int aa,bb,cc,dd,ee,ff,gg,hh,ii,jj,kk,mm,nn,oo,pp,qq,rr,ss,tt,uu,vv,ww,xx,yy,zz;
  36. int tc;
  37. ///
  38.  
  39. #define __L p<<1, L, L+R>>1
  40. #define __R p<<1|1, (L+R>>1)+1, R
  41.  
  42. int n;
  43. VVI adjList;
  44. VIII edgeList;
  45. vector<int> parent, depth, heavy, head, pos;
  46. int cur_pos;
  47.  
  48. int seg[100010<<2];
  49. int upd(int p, int L, int R, int i, int val){
  50.   if(L==R && L==i) return seg[p]=val;
  51.   if(L>i || R<i)   return seg[p];
  52.   int a = upd(__L, i, val);
  53.   int b = upd(__R, i, val);
  54.   return seg[p] = max(a, b);
  55. }
  56. int qry(int p, int L, int R, int i, int j){
  57.   if(L>j  ||  R<i) return -INF;
  58.   if(L>=i && R<=j) return seg[p];
  59.   int a = qry(__L, i, j);
  60.   int b = qry(__R, i, j);
  61.   return max(a,b);
  62. }
  63.  
  64.  
  65. int dfs(int u){
  66.   int size = 1, mx = 0;
  67.   for(auto v:adjList[u])
  68.     if(v!=parent[u]){
  69.       parent[v]=u; depth[v]=depth[u]+1;
  70.       int x = dfs(v);
  71.       size += x;
  72.       if(x > mx) mx=x, heavy[u]=v;
  73.     }
  74.   return size;
  75. }
  76. int decompose(int u, int h){
  77.   head[u]=h; pos[u]=cur_pos++;
  78.   if(heavy[u]!=-1)
  79.     decompose(heavy[u], h);
  80.   for(auto v:adjList[u])
  81.     if(v!=parent[u] && v!=heavy[u])
  82.       decompose(v, v);
  83. }
  84. int init(){
  85.   int n = adjList.size();
  86.   parent = vector<int>(n); head = vector<int>(n);
  87.   depth  = vector<int>(n); pos  = vector<int>(n);
  88.   heavy  = vector<int>(n, -1);       cur_pos = 0;
  89.   dfs(0);     decompose(0, 0);
  90. }
  91. int query(int u, int v)
  92. {
  93.   int res = 0;
  94.   for( ; head[u]!=head[v] ; v=parent[head[v]]){
  95.     if(depth[head[u]] > depth[head[v]]) swap(u,v);
  96.     int cur_heavy_path_ans = qry(1, 0, n-1, pos[head[v]], pos[v]);
  97.     res = max(res, cur_heavy_path_ans); // merge partial solution
  98.   }
  99.   if(depth[u] > depth[v]) swap(u,v);
  100.  
  101.   if(u==v) return res;
  102.   else{
  103.     int last_heavy_path_ans = qry(1, 0, n-1, pos[u]+1, pos[v]);
  104.     return max(res, last_heavy_path_ans);
  105.   }
  106. }
  107.  
  108. int main()
  109. {
  110.   in(tc);
  111.   while(tc--)
  112.   {
  113.     in(n);
  114.     adjList.clear();
  115.     edgeList.clear();
  116.     adjList.resize(n);
  117.     for(int i=1 ; i<n ; i++){
  118.       int u=getint-1, v=getint-1, w=getint;
  119.       adjList[u].pb(v);
  120.       adjList[v].pb(u);
  121.       edgeList.pb({w, {u,v}});
  122.     }
  123.     init();
  124.     for(auto e:edgeList){
  125.       int u = e.sc.fr;
  126.       int v = e.sc.sc;
  127.       if(depth[u]>depth[v]) swap(u,v);
  128.       upd(1, 0, n-1, pos[v], e.fr);
  129.     }
  130.  
  131.     string s;
  132.     while(cin>>s, s[0]!='D')
  133.     {
  134.       if(s[0]=='Q'){
  135.         int u=getint-1, v=getint-1;
  136.         cout << query(u, v, 0) << endl;
  137.       }
  138.       else{
  139.         int idx=getint-1, val=getint;
  140.         int u = edgeList[idx].sc.fr;
  141.         int v = edgeList[idx].sc.sc;
  142.         if(depth[u]>depth[v]) swap(u,v);
  143.         upd(1, 0, n-1, pos[v], val);
  144.       }
  145.     }
  146.   }
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement