0
点赞
收藏
分享

微信扫一扫

POJ 2763

外贸达人小峻先森 2022-03-22 阅读 59
c++
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
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],w[maxn*2],beg[maxn];

struct edege{int e1,e2;}e[maxn];
int no[maxn];

int a[maxn];
int fa[maxn],dis[maxn],size[maxn],son[maxn],top[maxn];
int id[maxn],rank[maxn];
int Sum[maxn*4];
int n,q,s,cnt,tot; 
void add(int x,int y,int z){
	to[++tot]=y;
	nex[tot]=beg[x];
	beg[x]=tot;
	w[tot]=z;
}
void dfs1(int rt,int ba){	
	size[rt]=1;		dis[rt]=dis[ba]+1;
	for(int i=beg[rt] ; i ; i=nex[i]){
		int u=to[i];		
		if(u!=ba){
			a[u]=w[i];
			fa[u]=rt;	dfs1(u,rt);
			size[rt]+=size[u];
			if(size[u]>size[son[rt]])son[rt]=u;			
		}
	}
}
void dfs2(int rt,int tp){
	top[rt]=tp;
	id[++cnt]=rt;	rank[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)
        Sum[rt] = num;  
    else{  
        if( pos <= Mid)  
            update(lson,pos,num);  
        if( pos > Mid)  
            update(rson,pos,num);  
        Sum[rt] =Sum[rt<<1]+Sum[rt<<1|1];
    }  
}

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

int main(){
	int rt;
	cin>>n>>q>>s;
	for(int i=1;i<n;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);		add(y,x,z);	
		e[i].e1=x;	e[i].e2=y;		
	}	
	dfs1(s,0);
	for(int i=1;i<n;i++){
		if(dis[e[i].e1]>dis[e[i].e2])no[i]=e[i].e1;
		else	no[i]=e[i].e2;
	}	
	dfs2(s,s);	
	
	for(int i=1;i<=n;i++)update(1,1,n,rank[i],a[i]);
	
	int last=s;
	for(int i=1;i<=q;i++){
		int o,x,y;
		scanf("%d",&o); 
		if(o==0){
			scanf("%d",&x);	
			int u=last,v=x;			
			int ans=0;
			while(top[u]!=top[v]){
				if(dis[top[u]]<dis[top[v]]){
					int tmp=u;	u=v;	v=tmp;
				}
				//ans+=sum(rank[u])-sum(rank[top[u]]-1);				
				ans += query(1,1,n,rank[top[u]],rank[u]);
				u=fa[top[u]];								
			}
			if(dis[u]<dis[v]){
				int tmp=u;	u=v;	v=tmp;
			}
			//ans+=sum(rank[u])-sum(rank[v]);
			ans += query(1,1,n,rank[v]+1,rank[u]);
			last=x;
			printf("%d\n",ans);
		}else{
			scanf("%d%d",&x,&y);
			update(1,1,n,rank[no[x]],-a[no[x]]);
			update(1,1,n,rank[no[x]],y);
			a[no[x]]=y;	
		}	
	}
	return 0;
}
举报

相关推荐

0 条评论