#include <bits/stdc++.h>
using namespace std;using namespace chrono;typedef signed char i8;typedef short i16;typedef int i32;typedef long long i64;typedef unsigned char u8;typedef unsigned short u16;typedef unsigned u32;typedef unsigned long long u64;typedef float f32;typedef double f64;typedef long double f96;template<typename A,typename B>void to_MAX(A& a,B b){if(a<b)a=b;}template<typename A,typename B>void to_MIN(A& a,B b){if(b<a)a=b;}template<typename... args>auto MAX(args... a){return max({a...});}template<typename... args>auto MIN(args... a){return min({a...});}
#ifndef ONLINE_JUDGE
#define debug(...) fprintf(stderr,__VA_ARGS__)
#else
#define debug(...)
#endif
#define __use_fast_io
namespace fast_io{
#ifndef __cplusplus
#define __cplusplus 201402L
#endif
const unsigned is(1<<21),os(1<<14);bool ne;char i[is],o[os],*ib(i),*ie(i),*ob(o),*oe(o+os),a[20],&c(*a),*b;void f(){ob-=fwrite(o,1,ob-o,stdout);}void p(char c){if(ob==oe)f();*ob++=c;}template<typename T>void _write(T&r){if(r==0)return p('0');if(r<0)p('-'),r=~(r-1);for(b=a;r;r/=10)*++b=(r%10)^'0';while(b!=a)p(*b--);}
#define g (ib==ie&&(ie=(ib=i)+fread(i,1,is,stdin),ib==ie)?-1:*ib++)
void reads(char*s){for(c=g;~c&&isspace(c);c=g);for(*s++=c,c=g;~c&&!isspace(c);c=g)*s++=c;*s=0;}template<typename T>void read(T&r){ne=false;for(c=g;~c&&(c<'0'||c>'9');c=g)ne=(c=='-');for(r=c^'0',c=g;isdigit(c);c=g)r=(r<<3)+(r<<1)+(c^'0');if(ne)r=~(r-1);}template<>void read<char>(char&r){for(c=g;~c&&isspace(c);c=g);r=c;}template<>void read<string>(string&r){r.clear();for(c=g;~c&&isspace(c);c=g);for(r.push_back(c),c=g;~c&&!isspace(c);c=g)r.push_back(c);}
#undef g
#if(__cplusplus>=201703L)
template<typename...Args>void read(Args&...args){(read(args),...);}template<typename...Args>void _write(Args&...args){(_write(args),...);}
#else
template<typename T,typename...args>void read(T&a,args&...b){read(a);read(b...);}template<typename T,typename...args>void _write(T&a,args&...b){_write(a);_write(b...);}
#endif
template<>void _write<char>(char&r){p(r);}template<>void _write<char*>(char*&r){for(;*r;p(*r++));}template<>void _write<const char*>(const char*&r){for(;*r;p(*r++));}template<>void _write<string>(string&r){const char*s(r.data());_write(s);}template<typename...args>void write(args...a){_write(a...);}struct _des{~_des(){f();}}d;}using fast_io::read;using fast_io::reads;using fast_io::write;
const int N(1e5+5),NC(1391857646),INF(INT_MAX);
// 0:链 1:子树
int root,n,m;
namespace SATT{
void Debug();
int sta[N<<1],top;
struct node{
bool re;
int ch[3],fa,sz[3],co[2],va,lz[2],su[3],mi[3],ma[3];
}t[N<<1];
#define re(u) t[u].re
#define ls(u) t[u].ch[0]
#define rs(u) t[u].ch[1]
#define ms(u) t[u].ch[2]
#define son(u,k) t[u].ch[k]
#define fa(u) t[u].fa
#define va(u) t[u].va
#define sz(u,k) t[u].sz[k]
#define co(u,k) t[u].co[k]
#define mi(u,k) t[u].mi[k]
#define ma(u,k) t[u].ma[k]
#define lz(u,k) t[u].lz[k]
#define su(u,k) t[u].su[k]
void push_up(int u,bool rake){
// if(u==5){
// debug("push_up ch=[%d,%d,%d]\n",ls(u),rs(u),ms(u));
// }
if(rake){
sz(u,0)=sz(ls(u),0)+sz(rs(u),0)+sz(ms(u),0)+sz(ms(u),2);
mi(u,0)=MIN(mi(ls(u),0),mi(rs(u),0),mi(ms(u),0),mi(ms(u),2));
ma(u,0)=MAX(ma(ls(u),0),ma(rs(u),0),ma(ms(u),0),ma(ms(u),2));
su(u,0)=su(ls(u),0)+su(rs(u),0)+su(ms(u),0)+su(ms(u),2);
}else{
sz(u,0)=sz(ls(u),0)+sz(rs(u),0)+1;
sz(u,1)=sz(ms(u),0);
sz(u,2)=sz(ls(u),2)+sz(rs(u),2)+sz(ms(u),0);
mi(u,0)=MIN(mi(ls(u),0),mi(rs(u),0),va(u));
mi(u,1)=mi(ms(u),0);
mi(u,2)=MIN(mi(ls(u),2),mi(rs(u),2),mi(ms(u),0));
ma(u,0)=MAX(ma(ls(u),0),ma(rs(u),0),va(u));
ma(u,1)=ma(ms(u),0);
ma(u,2)=MAX(ma(ls(u),2),ma(rs(u),2),ma(ms(u),0));
su(u,0)=su(ls(u),0)+su(rs(u),0)+va(u);
su(u,1)=su(ms(u),0);
su(u,2)=su(ls(u),2)+su(rs(u),2)+su(ms(u),0);
}
}
bool n_rt(int u){
return ls(fa(u))==u||rs(fa(u))==u;
}
int dir(int u){
return ms(fa(u))==u?2:rs(fa(u))==u;
}
void rotate(int u,bool rake){
int f(fa(u)),g(fa(f)),d(dir(u));
son(f,d)=son(u,d^1);
if(son(f,d)){
fa(son(f,d))=f;
}
son(u,d^1)=f;
if(g){
son(g,dir(f))=u;
}
fa(f)=u;fa(u)=g;
push_up(f,rake);
push_up(u,rake);
}
void tag(int u){
if(u){
re(u)^=true;
swap(ls(u),rs(u));
}
}
void tag0(int u,int k){
if(u){
va(u)+=k;
lz(u,0)+=k;
ma(u,0)+=k;
mi(u,0)+=k;
su(u,0)+=sz(u,0)*k;
}
}
void tag1(int u,int k,bool rake){
if(u){
lz(u,1)+=k;
mi(u,0)+=k;
ma(u,0)+=k;
su(u,0)+=sz(u,0)*k;
if(!rake){
va(u)+=k;
if(sz(u,1)){
mi(u,1)+=k;ma(u,1)+=k;su(u,1)+=sz(u,1)*k;
}
if(sz(u,2)){
mi(u,2)+=k;ma(u,2)+=k;su(u,2)+=sz(u,2)*k;
}
}
}
}
void tag2(int u,int k){
if(u){
co(u,0)=va(u)=ma(u,0)=mi(u,0)=k;
lz(u,0)=-lz(u,1);
su(u,0)=sz(u,0)*k;
va(u)=k;
}
}
void tag3(int u,int k,bool rake){
if(u){
// if(u==5){
// debug("tag3 %d\n",k);
// }
co(u,1)=ma(u,0)=mi(u,0)=k;
co(u,0)=NC;
lz(u,0)=lz(u,1)=0;
su(u,0)=sz(u,0)*k;
if(!rake){
va(u)=k;
if(sz(u,1)){
mi(u,1)=ma(u,1)=k;
su(u,1)=sz(u,1)*k;
}
if(sz(u,2)){
mi(u,2)=ma(u,2)=k;
su(u,2)=sz(u,2)*k;
}
}
}
}
void push_down(int u,bool rake){
if(re(u)){
tag(ls(u));
tag(rs(u));
re(u)=false;
}
if(co(u,1)!=NC){
tag3(ls(u),co(u,1),rake);
tag3(rs(u),co(u,1),rake);
tag3(ms(u),co(u,1),!rake);
co(u,1)=NC;
}
if(co(u,0)!=NC){
tag2(ls(u),co(u,0));
tag2(rs(u),co(u,0));
co(u,0)=NC;
}
if(lz(u,0)){
tag0(ls(u),lz(u,0));
tag0(rs(u),lz(u,0));
lz(u,0)=0;
}
if(lz(u,1)){
tag1(ls(u),lz(u,1),rake);
tag1(rs(u),lz(u,1),rake);
tag1(ms(u),lz(u,1),!rake);
lz(u,1)=0;
}
}
void push(int u,bool rake){
if(fa(u)){
push(fa(u),rake^(dir(u)==2));
}
push_down(u,rake);
}
void splay(int u,bool rake,int p=0){
push(u,rake);
for(int f;n_rt(u)&&fa(u)!=p;rotate(u,rake)){
f=fa(u);
if(n_rt(f)&&fa(f)!=p){
rotate(dir(u)^dir(f)?u:f,rake);
}
}
}
int new_node(){
int u(sta[--top]);
ls(u)=rs(u)=ms(u)=fa(u)=su(u,0)=sz(u,0)=lz(u,0)=lz(u,1)=re(u)=false;
ma(u,0)=INT_MIN;
mi(u,0)=INT_MAX;
co(u,0)=co(u,1)=NC;
return u;
}
void set_fa(int u,int f,int d){
if(u){
fa(u)=f;
}
son(f,d)=u;
}
void splice(int u){
splay(u,true);
int f(fa(u));
splay(f,false);
push_down(u,true);
if(rs(f)){
swap(fa(ms(u)),fa(rs(f)));
swap(ms(u),rs(f));
push_up(u,true);
}else{
set_fa(ms(u),f,1);
if(ls(u)){
int v(ls(u));
while(push_down(v,true),rs(v)){
v=rs(v);
}
splay(v,true,u);
set_fa(rs(u),v,1);
push_up(v,true);
set_fa(v,f,2);
}else{
set_fa(rs(u),f,2);
}
sta[top++]=u;
}
push_up(f,false);
}
void access(int u){
int old_u(u);
splay(u,false);
if(rs(u)){
int v(new_node());
set_fa(rs(u),v,2);
rs(u)=0;
set_fa(ms(u),v,0);
push_up(v,true);
set_fa(v,u,2);
push_up(u,false);
}
while(fa(u)){
splice(fa(u));
u=fa(u);
}
splay(old_u,false);
}
void make_root(int u){
access(u);
tag(u);
}
void split(int u,int v){
make_root(u);
// if(u==3&&v==10){
// Debug();
// }
access(v);
}
int find_root(int u){
access(u);
while(push_down(u,false),ls(u)){
u=ls(u);
}
return u;
}
void link(int u,int v){
make_root(u);
access(v);
set_fa(u,v,1);
push_up(v,false);
}
void cut(int u,int v){
split(u,v);
fa(u)=ls(v)=0;
push_up(v,false);
}
void op0(int x,int y){
split(root,x);
va(x)=y;
tag3(ms(x),y,true);
push_up(x,false);
}
void op1(int x){
root=x;
}
void op2(int x,int y,int z){
split(x,y);
tag2(y,z);
}
int op3(int x){
split(root,x);
return MIN(mi(x,1),va(x));
}
int op4(int x){
split(root,x);
return MAX(ma(x,1),va(x));
}
void op5(int x,int y){
split(root,x);
va(x)+=y;
tag1(ms(x),y,true);
push_up(x,false);
}
void op6(int x,int y,int z){
split(x,y);
tag0(y,z);
}
int op7(int x,int y){
split(x,y);
return mi(y,0);
}
int op8(int x,int y){
split(x,y);
return ma(y,0);
}
void op9(int x,int y){
if(x==y){
return;
}
split(root,y);
splay(x,false);
if(fa(y)){
return;
}
split(root,x);
int v(ls(x));
while(push_down(v,false),rs(v)){
v=rs(v);
}
cut(v,x);
link(x,y);
}
int op10(int x,int y){
split(x,y);
return su(y,0);
}
int op11(int x){
split(root,x);
return su(x,1)+va(x);
}
void change_val(int u,int v){
make_root(u);
va(u)=v;
push_up(u,false);
}
void reset_nodes(){
int i;
for(i=(N<<1)-1;i>n;--i){
sta[top++]=i;
}
for(i=1;i<=n;++i){
push_up(i,false);
}
mi(0,0)=mi(0,1)=mi(0,2)=INF;
ma(0,0)=ma(0,1)=ma(0,2)=-INF;
}
void Debug(){
for(int i=1;i<=19;++i){
debug("ch=[%d,%d,%d],fa=%d,va=%d,ma=[%d,%d,%d],co1=%d\n",ls(i),rs(i),ms(i),fa(i),va(i),ma(i,0),ma(i,1),ma(i,2),co(i,1));
}
debug("\n");
}
}
int main(){
freopen("8.in","r",stdin);
freopen("out.txt","w",stdout);
system_clock::time_point b_t(system_clock::now());
int i,op,u,v,w;
read(n,m);
SATT::reset_nodes();
for(i=1;i<n;++i){
// debug("0 i=%d\n",i);
read(u,v);
SATT::link(u,v);
}
for(i=1;i<=n;++i){
// debug("1 i=%d\n",i);
read(u);
SATT::change_val(i,u);
}
read(root);
for(i=1;i<=m;++i){
// debug("2 i=%d\n",i);
read(op,u);
switch(op){
case 0:
read(v);
SATT::op0(u,v);
break;
case 1:
SATT::op1(u);
break;
case 2:
read(v,w);
SATT::op2(u,v,w);
break;
case 3:
write(SATT::op3(u),'\n');
break;
case 4:
write(SATT::op4(u),'\n');
break;
case 5:
read(v);
SATT::op5(u,v);
break;
case 6:
read(v,w);
SATT::op6(u,v,w);
break;
case 7:
read(v);
write(SATT::op7(u,v),'\n');
break;
case 8:
read(v);
write(SATT::op8(u,v),'\n');
break;
case 9:
read(v);
SATT::op9(u,v);
break;
case 10:
read(v);
write(SATT::op10(u,v),'\n');
break;
case 11:
write(SATT::op11(u),'\n');
break;
}
// if(i<=3)
// SATT::Debug();
}
system_clock::time_point e_t(system_clock::now());
debug("%lldms\n",duration_cast<milliseconds>(e_t-b_t).count());
return 0;
}
在第 386 行赋权时,每隔 10001 个数就卡几秒。