LCT似乎都除了问题,我AFO罢/kk
第一次查询正确,第二次查询错误,然后死循环。。。
求dalao帮忙查一下这个LCT哪儿错了/kel
#include<cstdio>
#define DEBUG printf("Baylor AK IOI!!!/n");
const int M=1e5+5;
int n,m,a[M],f[M],siz[M],dp[M][2],chi[M][2];
inline int max(const int&a,const int&b){
return a>b?a:b;
}
struct Edge{
int to;Edge*nx;
}e[M<<1],*h[M],*cnt=e;
inline void Add(const int&u,const int&v){
*cnt=(Edge){v,h[u]};h[u]=cnt++;
*cnt=(Edge){u,h[v]};h[v]=cnt++;
}
struct Matrix{
int a[2][2];
inline Matrix(){
a[0][0]=a[0][1]=a[1][0]=a[1][1]=0;
}
inline int*operator[](const int&n){
return a[n];
}
friend inline Matrix operator*(Matrix a,Matrix b){
Matrix c;
int i,j,k;
for(i=0;i<2;++i){
for(j=0;j<2;++j){
for(k=0;k<2;++k){
c[i][j]=max(c[i][j],a[i][k]+b[k][j]);
}
}
}
return c;
}
}val[M],sum[M];
void Firsk_DFS(int u){
dp[u][1]=a[u];
for(Edge*E=h[u];E;E=E->nx){
int v=E->to;
if(v==f[u])continue;
f[v]=u;Firsk_DFS(v);
dp[u][0]+=max(dp[v][0],dp[v][1]);
dp[u][1]+=dp[v][0];
}
val[u][0][0]=val[u][0][1]=dp[u][0];
val[u][1][0]=dp[u][1];
sum[u]=val[u];
}
inline void update(const int&u){
sum[u]=val[u];
if(chi[u][0])sum[u]=sum[chi[u][0]]*sum[u];
if(chi[u][1])sum[u]=sum[u]*sum[chi[u][1]];
}
inline bool get(const int&u){
return chi[f[u]][0]==u||chi[f[u]][1]==u;
}
inline bool son(const int&u){
return chi[f[u]][1]==u;
}
inline void connect(int u,int fa,int s){
chi[fa][s]=u;f[u]=fa;
}
inline void rotate(int u){
int v=f[u],f1=get(u),f2=son(v);
if(chi[v][f1]=chi[u][!f1])f[chi[u][!f1]]=v;
if(get(v))chi[f[v]][f2]=u;f[u]=f[v];
chi[f[v]=u][!f1]=v;
update(v);
}
inline void Splay(int u){
int v;
while(get(u)){
if(get(v=f[u]))rotate(son(u)^son(v)?u:v);
rotate(u);
}
}
inline void Access(int u){
for(int v=0;u;u=f[v=u]){
Splay(u);
if(chi[u][1]){
val[u][0][0]+=max(sum[chi[u][1]][0][0],sum[chi[u][1]][1][0]);
val[u][1][0]+=sum[chi[u][1]][0][0];
}
if(v){
val[u][0][0]-=max(sum[v][0][0],sum[v][1][0]);
val[u][1][0]-=sum[v][0][0];
}
val[u][0][1]=val[u][0][0];
chi[u][1]=v;
update(u);
}
}
inline void Modify(int u,int x){
Access(u);Splay(u);
val[u][1][0]-=a[u]-x;
update(u);
a[u]=x;
}
signed main(){
int i,u,v;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)scanf("%d",a+i);
for(i=1;i<n;++i){
scanf("%d%d",&u,&v);
Add(u,v);
}
Firsk_DFS(1);
for(i=1;i<=m;++i){
scanf("%d%d",&u,&v);
Modify(u,v);Splay(1);
printf("%d\n",max(sum[1][0][0],val[1][1][0]));
}
}