都写的是动态开点线段树+树剖,我为什么5MLE2TLE?
#include<bits/stdc++.h>
using namespace std;
const int N=1e5,MX=2e7;
int n,q,a[N],c[N];
int sz[N],son[N],dfn[N],top[N],tim,fa[N],dep[N];
int root[N],sum[MX],mx[MX],ls[MX],rs[MX],tot;
vector<int>g[N];
void dfs(int x,int f){
fa[x]=f;sz[x]=1;
dep[x]=dep[f]+1;
for(int v:g[x]){
if(v==f)continue;
dfs(v,x);
sz[x]+=sz[v];
if(sz[v]>sz[son[x]])son[x]=v;
}
}
void dfs1(int x,int rt){
top[x]=rt;
dfn[x]=++tim;
if(son[x])dfs1(son[x],rt);
for(int v:g[x]){
if(v==fa[x]||v==son[x])continue;
dfs1(v,v);
}
}
void pushup(int rt){
sum[rt]=sum[ls[rt]]+sum[rs[rt]];
mx[rt]=max(mx[ls[rt]],mx[rs[rt]]);
}
void modify(int &rt,int l,int r,int p,int k){
if(!rt)
rt=++tot;
if(l==r){
sum[rt]=mx[rt]=k;return;
}
int mid=(l+r)>>1;
if(p<=mid)modify(ls[rt],l,mid,p,k);
else modify(rs[rt],mid+1,r,p,k);
pushup(rt);
}
int segsum(int rt,int l,int r,int L,int R){
if(!rt)return 0;
if(L<=l&&r<=R)
return sum[rt];
int mid=(l+r)>>1,res=0;
res+=segsum(ls[rt],l,mid,L,R);
res+=segsum(rs[rt],mid+1,r,L,R);
return res;
}
int segmx(int rt,int l,int r,int L,int R){
if(!rt)return 0;
if(L<=l&&r<=R)return mx[rt];
int mid=(l+r)>>1,res=0;
res=max(res,segmx(ls[rt],l,mid,L,R));
res=max(res,segmx(rs[rt],mid+1,r,L,R));
return res;
}
int Tsum(int u,int v,int k){
int res=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
res+=segsum(root[k],1,n,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if(dep[u]>dep[v])swap(u,v);
res+=segsum(root[k],1,n,dfn[u],dfn[v]);
return res;
}
int Tmx(int u,int v,int k){
int res=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
res=max(res,segmx(root[k],1,n,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(dep[u]>dep[v])swap(u,v);
res=max(res,segmx(root[k],1,n,dfn[u],dfn[v]));
return res;
}
int main(){
cin>>n>>q;
for(int i=1;i<=n;++i)
scanf("%d%d",&a[i],&c[i]);
for(int i=1;i<=n-1;++i){
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,0);
dfs1(1,1);
for(int i=1;i<=n;++i)
modify(root[c[i]],1,n,dfn[i],a[i]);
for(int i=1;i<=q;++i){
string op;
int u,v;
cin>>op;
scanf("%d%d",&u,&v);
if(op=="CC"){
modify(root[c[u]],1,n,dfn[u],0);
modify(root[v],1,n,dfn[u],a[u]);
c[u]=v;
}
if(op=="CW"){
modify(root[c[u]],1,n,dfn[u],v);
a[u]=v;
}
if(op=="QS"){
printf("%d\n",Tsum(u,v,c[u]));
}
if(op=="QM"){
printf("%d\n",Tmx(u,v,c[u]));
}
}
return 0;
}