带修改树上莫队裸题
挺好写的嘛-_-
带修改树上莫队可以看这里
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<map>
using namespace std;
#define MAXN 100010
#define MAXM 1010
#define ll long long
#define eps 1e-8
#define INF 1000000000
#define MOD 1000000007
struct que{
int x;
int y;
int t;
int num;
};
struct ch{
int t;
int x;
int vl;
int vn;
};
struct vec{
int to;
int fro;
};
vec mp[MAXN*2];
int tai[MAXN],cnt;
int bel[MAXN];
int v[MAXN],a[MAXN],w[MAXN];
int fa[MAXN][20],dep[MAXN];
int tot;
int MX,SZ;
int n,m,M;
int C,Q;
int st[MAXN],tp;
que q[MAXN];
ch c[MAXN];
int wzh;
ll ANS;
ll ans[MAXN];
bool vis[MAXN];
int ct[MAXN];
inline void be(int x,int y){
mp[++cnt].to=y;
mp[cnt].fro=tai[x];
tai[x]=cnt;
}
inline void bde(int x,int y){
be(x,y);
be(y,x);
}
bool operator <(que x,que y){
return bel[x.x]!=bel[y.x]?bel[x.x]<bel[y.x]:bel[x.y]!=bel[y.y]?bel[x.y]<bel[y.y]:x.t<y.t;
}
void dfs(int x){
int i,j,t,y;
dep[x]=dep[fa[x][1]]+1;
int now=tp;
for(i=tai[x];i;i=mp[i].fro){
y=mp[i].to;
if(!dep[y]){
for(t=x,j=1;t;j++){
fa[y][j]=t;
t=fa[t][j];
}
dfs(y);
if(tp-now>MX){
tot++;
while(tp!=now){
bel[st[tp--]]=tot;
}
}
}
}
st[++tp]=x;
if(x==1){
tot++;
while(tp!=now){
bel[st[tp--]]=tot;
}
}
}
int lca(int x,int y){
int i;
if(dep[x]<dep[y]){
swap(x,y);
}
for(i=19;i;i--){
if(dep[fa[x][i]]>=dep[y]){
x=fa[x][i];
}
}
for(i=19;i;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return x==y?x:fa[x][1];
}
void rev(int x){
if(vis[x]){
ANS-=(ll)w[ct[a[x]]--]*v[a[x]];
vis[x]=0;
}else{
ANS+=(ll)w[++ct[a[x]]]*v[a[x]];
vis[x]=1;
}
}
void change(int x,int y){
if(vis[x]){
ANS-=(ll)w[ct[a[x]]--]*v[a[x]];
ANS+=(ll)w[++ct[y]]*v[y];
}
a[x]=y;
}
int main(){
int i,j,o,x,y;
scanf("%d%d%d",&n,&m,&M);
MX=int(pow(n,2.0/3)+eps);
SZ=int(sqrt(m)+eps);
for(i=1;i<=m;i++){
scanf("%d",&v[i]);
}
for(i=1;i<=n;i++){
scanf("%d",&w[i]);
}
for(i=1;i<n;i++){
scanf("%d%d",&x,&y);
bde(x,y);
}
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=M;i++){
scanf("%d%d%d",&o,&x,&y);
if(!o){
C++;
c[C].x=x;
c[C].vl=a[x];
c[C].vn=y;
c[C].t=i;
a[x]=y;
}else{
Q++;
q[Q].x=x;
q[Q].y=y;
q[Q].t=i;
q[Q].num=Q;
}
}
dfs(1);
sort(q+1,q+Q+1);
for(i=C;i;i--){
a[c[i].x]=c[i].vl;
}
int L=1,R=1;
for(i=1;i<=Q;i++){
x=q[i].x;
y=q[i].y;
int l1=lca(L,x);
int l2=lca(R,y);
for(j=L;j!=l1;j=fa[j][1]){
rev(j);
}
for(j=x;j!=l1;j=fa[j][1]){
rev(j);
}
for(j=R;j!=l2;j=fa[j][1]){
rev(j);
}
for(j=y;j!=l2;j=fa[j][1]){
rev(j);
}
L=x;
R=y;
int l=lca(L,R);
rev(l);
while(wzh<C&&c[wzh+1].t<q[i].t){
change(c[wzh].x,c[++wzh].vn);
}
while(wzh&&c[wzh].t>q[i].t){
change(c[wzh--].x,c[wzh].vl);
}
ans[q[i].num]=ANS;
rev(l);
}
for(i=1;i<=Q;i++){
printf("%lld\n",ans[i]);
}
return 0;
}
/*
4 3 5
1 9 2
7 6 5 1
2 3
3 1
3 4
1 2 3 2
1 1 2
1 4 2
0 2 1
1 1 2
1 4 2
*/