线段树区间修改和取最值,首先根据dfs序,确立每个点应该对应的区间。
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define ll long long
#define pl c<<1
#define pr (c<<1)|1
#define lson tree[c].l,tree[c].mid,pl
#define rson tree[c].mid+1,tree[c].r,pr
const int maxn=1e5+10;
struct node{
int l,r,mid;ll sum,add,maxx;
}tree[maxn<<4];
ll num[maxn];
void pushup(int c){
if(tree[c].l==tree[c].r) return ;
tree[c].maxx=max(tree[pl].maxx,tree[pr].maxx);
}
void build(int l,int r,int c){
tree[c].l=l;tree[c].r=r;tree[c].mid=(l+r)/2;
tree[c].add=0;
if(l==r){
tree[c].maxx=tree[c].sum=num[l];
return ;
}
build(lson);
build(rson);
pushup(c);
}
void pushdown(int c){
if(tree[c].l==tree[c].r) return ;
if(tree[c].add){
tree[pl].maxx+=tree[c].add;
tree[pr].maxx+=tree[c].add;
tree[pl].add+=tree[c].add;
tree[pr].add+=tree[c].add;
tree[c].add=0;
}
}
void update(int l,int r,int c,int x,int y,int val){
if(tree[c].add) pushdown(c);
if(x==l&&y==r){
tree[c].maxx+=val;tree[c].add+=val;return ;
}
if(y<=tree[c].mid){
update(lson,x,y,val);
}
else if(x>tree[c].mid){
update(rson,x,y,val);
}
else{
update(lson,x,tree[c].mid,val);
update(rson,tree[c].mid+1,y,val);
}
pushup(c);
}
ll query(int l,int r,int c,int x,int y){
if(tree[c].add) pushdown(c);
if(l==x&&y==r){
return tree[c].maxx;
}
if(y<=tree[c].mid){
return query(lson,x,y);
}
else if(x>tree[c].mid){//此处不能有等于,因为rson 是mid+1而x...
return query(rson,x,y);
}
else {
return max(query(lson,x,tree[c].mid),query(rson,tree[c].mid+1,y));
}
}
int t ,l[maxn],r[maxn];
vector<int>a[maxn];
void add(int x,int y){
a[x].push_back(y);
}
int index;
ll val[maxn];
void dfs(int u,int fa,ll sum){
sum+=val[u];
l[u]=maxn;int son=0;
for(int i=0;i<a[u].size();i++){
int v=a[u][i];//son++;
if(v==fa) continue;
son++;
dfs(v,u,sum);
l[u]=min(l[u],l[v]);
}
r[u]=++index;
num[index]=sum;
if(son==0){
l[u]=r[u];
}
}
int n,m;
int main(){
cin>>t;int kk=1;
while(t--){
printf("Case #%d:\n",kk++);
index=0;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++) a[i].clear();
int a,b;
for(int i=0;i<n-1;i++){
scanf("%d%d",&a,&b);add(a,b);add(b,a);
}
for(int i=0;i<n;i++){
scanf("%lld",&val[i]);
}
dfs(0,0,0);
/* for(int i =0;i<n;i++){
cout<<" i = "<<i<<" l = "<<l[i]<<" r = "<<r[i]<<endl;
}*/
// cout<<"l = "<<l[1]<<" r = "<<r[1]<<endl;
// puts("nimabi");
build(1,n,1);
// puts("nimabi");
int op,x,y;
for(int i=0;i<m;i++){
scanf("%d",&op);
// puts("nimabi");
if(op==0){
scanf("%d%d",&x,&y);
ll ad=y-val[x];val[x]=y;
update(1,n,1,l[x],r[x],ad);
}
else{
scanf("%d",&x);
ll ans = query(1,n,1,l[x],r[x]);
printf("%lld\n",ans);
}
}
}
}