UESTC summer training A 【树链剖分 模板】

来源:互联网 发布:最新网络神曲 编辑:程序博客网 时间:2024/05/16 09:40
#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<cstring>using namespace std;typedef long long ll;void read(int& x){x = 0;char c = getchar();int flag = 1;while(c<'0'||c>'9'){c = getchar();if(c=='-')flag = -1;}while(c>='0'&&c<='9'){x = x*10+c-'0';c = getchar();}x*=flag;}#define maxn 100010int n,q;int nowedge = 1;struct edge{int v,next;}e[maxn<<1];int head[maxn];void adde(int u,int v){e[nowedge].v = v;e[nowedge].next = head[u];head[u] = nowedge++;}ll w[maxn];int son[maxn];int fa[maxn];int top[maxn];int tid[maxn],tim;int dep[maxn];int rank[maxn];int size[maxn];void dfs1(int u,int father,int d){dep[u] = d;size[u] = 1;fa[u] = father;for(int i=head[u];~i;i=e[i].next){int v = e[i].v;if(v!=father){dfs1(v,u,d+1);size[u]+=size[v];if(son[u]==-1||size[son[u]]<size[v])son[u] = v;}}}void dfs2(int u,int tp){top[u] = tp;tid[u] = ++tim;rank[tid[u]] = u;if(son[u]==-1)return;dfs2(son[u],tp);for(int i=head[u];~i;i=e[i].next){int v = e[i].v;if(v!=son[u]&&v!=fa[u])dfs2(v,v);}}struct SegmentTree{ll maxv;SegmentTree(){maxv = 0;}}tr[maxn<<4];void pushup(int u){tr[u].maxv=max(tr[u<<1].maxv,tr[u<<1|1].maxv);}void update(int u,int l,int r,int x,int add){if(l==r){tr[u].maxv+=add;return;}int mid = (l+r)>>1;if(x<=mid)update(u<<1,l,mid,x,add);else update(u<<1|1,mid+1,r,x,add);pushup(u);}ll query(int u,int l,int r,int x,int y){if(x<=l&&r<=y)return tr[u].maxv;int mid = (l+r)>>1;/*if(y<=mid)return query(u<<1,l,mid,x,y);else if(x>mid)return query(u<<1|1,mid+1,r,x,y);else{return max(query(u<<1,l,mid,x,mid),query(u<<1,mid+1,r,mid+1,y));}*/ll ret = -1e16;if(x<=mid)ret = max(ret,query(u<<1,l,mid,x,y));if(y>mid)ret = max(ret,query(u<<1|1,mid+1,r,x,y));return ret;}int Query(int x,int y){int fx = top[x],fy = top[y];ll ans = -1e16;while(fx!=fy){if(dep[fx]<dep[fy]){swap(fx,fy);swap(x,y);}ans = max(ans,query(1,1,n,tid[fx],tid[x]));x = fa[fx];fx = top[x];}ans = max(ans,(dep[x]>dep[y])?query(1,1,n,tid[y],tid[x]):query(1,1,n,tid[x],tid[y]));return ans;}int main(){#define LOC#ifdef LOCfreopen("A.in","r",stdin);freopen("A.out","w",stdout);#endifread(n);memset(head,-1,sizeof(head));memset(son,-1,sizeof(son));int x,y;for(int i=1;i<n;i++){read(x),read(y);adde(x,y);adde(y,x);}dfs1(1,0,1);dfs2(1,1);read(q);char op[2];for(int i=1;i<=q;i++){scanf("%s",op);read(x),read(y);if(op[0]=='I'){update(1,1,n,tid[x],y);w[x]+=y;}else printf("%d\n",Query(x,y));}//while(1);return 0;}

0 0