Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// __Macro's__
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define II pair<int,int>
- #define III pair<int, II>
- #define VL vector<ll>
- #define VI vector<int>
- #define VII vector<II>
- #define VIII vector<III>
- #define VVI vector<vector<int>>
- #define VVII vector<vector<II>>
- #define fr first
- #define sc second
- #define mkpr make_pair
- #define PQ priority_queue
- #define pb push_back
- #define eb emplace_back
- #define all(v) v.begin(), v.end()
- #define LINE putc('\n', stdout)
- #define SPACE putc(' ' , stdout)
- #define TAB putc('\t', stdout)
- #define fillarr(arr, val) fill((int*)arr, (int*)arr+(sizeof(arr)/sizeof(int)), val)
- #define Log2(x) (31^__builtin_clz(x))
- #define INF 1000000007
- #define MOD 1000000007
- #define getint ReadInt()
- const char IO_MODE = 0; // in-->00<--out (MSB-->LSB) | 0: Norm, 1: Fast
- 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';
- 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)
- 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))
- 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...);}
- 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))
- scanf("%lld",&x);}template<typename T, typename... Args>inline void in(T &x,Args&...args){in(x);in(args...);}
- 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;
- int tc;
- ///
- #define __L p<<1, L, L+R>>1
- #define __R p<<1|1, (L+R>>1)+1, R
- int n;
- VVI adjList;
- VIII edgeList;
- vector<int> parent, depth, heavy, head, pos;
- int cur_pos;
- int seg[100010<<2];
- int upd(int p, int L, int R, int i, int val){
- if(L==R && L==i) return seg[p]=val;
- if(L>i || R<i) return seg[p];
- int a = upd(__L, i, val);
- int b = upd(__R, i, val);
- return seg[p] = max(a, b);
- }
- int qry(int p, int L, int R, int i, int j){
- if(L>j || R<i) return -INF;
- if(L>=i && R<=j) return seg[p];
- int a = qry(__L, i, j);
- int b = qry(__R, i, j);
- return max(a,b);
- }
- int dfs(int u){
- int size = 1, mx = 0;
- for(auto v:adjList[u])
- if(v!=parent[u]){
- parent[v]=u; depth[v]=depth[u]+1;
- int x = dfs(v);
- size += x;
- if(x > mx) mx=x, heavy[u]=v;
- }
- return size;
- }
- int decompose(int u, int h){
- head[u]=h; pos[u]=cur_pos++;
- if(heavy[u]!=-1)
- decompose(heavy[u], h);
- for(auto v:adjList[u])
- if(v!=parent[u] && v!=heavy[u])
- decompose(v, v);
- }
- int init(){
- int n = adjList.size();
- parent = vector<int>(n); head = vector<int>(n);
- depth = vector<int>(n); pos = vector<int>(n);
- heavy = vector<int>(n, -1); cur_pos = 0;
- dfs(0); decompose(0, 0);
- }
- int query(int u, int v)
- {
- int res = 0;
- for( ; head[u]!=head[v] ; v=parent[head[v]]){
- if(depth[head[u]] > depth[head[v]]) swap(u,v);
- int cur_heavy_path_ans = qry(1, 0, n-1, pos[head[v]], pos[v]);
- res = max(res, cur_heavy_path_ans); // merge partial solution
- }
- if(depth[u] > depth[v]) swap(u,v);
- if(u==v) return res;
- else{
- int last_heavy_path_ans = qry(1, 0, n-1, pos[u]+1, pos[v]);
- return max(res, last_heavy_path_ans);
- }
- }
- int main()
- {
- in(tc);
- while(tc--)
- {
- in(n);
- adjList.clear();
- edgeList.clear();
- adjList.resize(n);
- for(int i=1 ; i<n ; i++){
- int u=getint-1, v=getint-1, w=getint;
- adjList[u].pb(v);
- adjList[v].pb(u);
- edgeList.pb({w, {u,v}});
- }
- init();
- for(auto e:edgeList){
- int u = e.sc.fr;
- int v = e.sc.sc;
- if(depth[u]>depth[v]) swap(u,v);
- upd(1, 0, n-1, pos[v], e.fr);
- }
- string s;
- while(cin>>s, s[0]!='D')
- {
- if(s[0]=='Q'){
- int u=getint-1, v=getint-1;
- cout << query(u, v, 0) << endl;
- }
- else{
- int idx=getint-1, val=getint;
- int u = edgeList[idx].sc.fr;
- int v = edgeList[idx].sc.sc;
- if(depth[u]>depth[v]) swap(u,v);
- upd(1, 0, n-1, pos[v], val);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement