0
点赞
收藏
分享

微信扫一扫

ural 1553 树剖+线段树

_karen 2022-03-22 阅读 24
c++
#include<bits/stdc++.h>
using namespace std;
#define Mid ((l+r)>>1)  
#define lson rt<<1,l,Mid  
#define rson rt<<1|1,Mid+1,r 

const int maxn=100000+10;
int to[maxn*2],nex[maxn*2],beg[maxn];

int fa[maxn],dis[maxn],siz[maxn],son[maxn],top[maxn];
int id[maxn],ran[maxn];
int Max[maxn*4];
int n,q,s,cnt,tot; 
void add(int x,int y){
	to[++tot]=y;
	nex[tot]=beg[x];
	beg[x]=tot;	
}
void dfs1(int rt,int ba){	
	siz[rt]=1;		dis[rt]=dis[ba]+1;
	for(int i=beg[rt] ; i ; i=nex[i]){
		int u=to[i];		
		if(u!=ba){		
			fa[u]=rt;	dfs1(u,rt);
			siz[rt]+=siz[u];
			if(siz[u]>siz[son[rt]])son[rt]=u;			
		}
	}
}
void dfs2(int rt,int tp){
	top[rt]=tp;
	id[++cnt]=rt;	ran[rt]=cnt;
	if(son[rt])dfs2(son[rt],tp);
	for(int i=beg[rt];i;i=nex[i]){
		int u=to[i];
		if(u!=son[rt] && u!=fa[rt])dfs2(u,u);
	}
}
void update(int rt,int l,int r,int pos,int num){ 
    if(l == r && r == pos){
        Max[rt] += num; 
    }else{  
        if( pos <= Mid)  
            update(lson,pos,num);  
        if( pos > Mid)  
            update(rson,pos,num);  
        Max[rt] =max(Max[rt<<1],Max[rt<<1|1]);
    }  
}

int query(int rt,int l,int r,int L,int R){  
    if(L <= l && r <= R)
        return Max[rt];  
    else{      
		int tmp=0;    
        if( L <= Mid)  
            tmp = max(tmp,query(lson,L,R));  
        if( R > Mid)  
            tmp = max(tmp,query(rson,L,R));  
        return tmp;  
    }  
}  

int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);		add(y,x);					
	}	
	dfs1(1,0);		
	dfs2(1,1);	
	cin>>q;	getchar();
	for(int i=1;i<=q;i++){
		int x,y;
		char o;
		scanf("%c %d %d",&o,&x,&y); 
		getchar();
		if(o=='G'){			
			int u=x,v=y;			
			int ans=0;
			while(top[u]!=top[v]){
				if(dis[top[u]]<dis[top[v]]){
					int tmp=u;	u=v;	v=tmp;
				}			
				ans = max(ans,query(1,1,n,ran[top[u]],ran[u]));	
				
				u=fa[top[u]];			
				
			}
			if(dis[u]<dis[v]){
				int tmp=u;	u=v;	v=tmp;
			}
			ans = max(ans,query(1,1,n,ran[v],ran[u]));					
			printf("%d\n",ans);
		}else{				
			update(1,1,n,ran[x],y);				
		}
	}

	return 0;
}

举报

相关推荐

0 条评论