这道题,我自己编译一点问题没有,交上去告诉我编译错误,也不说哪里错了,求大佬解惑,谢谢。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const long long MAX=1ll*1e13;
#define ll long long
struct EDGE{int to,nxt;}edge[MAXN<<1];
int head[MAXN],tot;
void Add(int x,int y){edge[++tot].to=y;edge[tot].nxt=head[x];head[x]=tot;}
int fa[MAXN][21],Log[MAXN];
int dep[MAXN];
int p[MAXN];
ll f[MAXN][2];
struct MATRIX{ll M[3][3]={{MAX,MAX,MAX},{MAX,MAX,MAX},{MAX,MAX,MAX}};};
MATRIX dp[MAXN][21];
struct VECTOR{ll V[1][3]={{MAX,MAX,MAX}};};
MATRIX matIni(ll m00,ll m01,ll m10,ll m11){MATRIX res;res.M[0][0]=m00;res.M[0][1]=m01;res.M[1][0]=m10;res.M[1][1]=m11;return res;}
VECTOR operator * (const VECTOR &a,const MATRIX b)
{VECTOR res;for(int j=0;j<3;j++)for(int k=0;k<3;k++)res.V[0][j]=min(res.V[0][j],a.V[0][k]+b.M[j][k]);return res;}
MATRIX operator * (const MATRIX &a,const MATRIX b)
{MATRIX res;for(int i=0;i<3;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++)res.M[i][j]=min(res.M[i][j],a.M[i][k]+b.M[j][k]);return res;}
void makeF(int x,int fat)
{
f[x][1]=p[x];
for(int i=head[x];i;i=edge[i].nxt)
if(edge[i].to!=fat)makeF(edge[i].to,x),f[x][0]+=f[edge[i].to][1],f[x][1]+=min(f[edge[i].to][0],f[edge[i].to][1]);
}
void makedp(int x,int fat)
{
fa[x][0]=fat;dep[x]=dep[fat]+1;
dp[x][0]=matIni(MAX,f[fat][1]-min(f[x][0],f[x][1]),f[fat][0]-f[x][1],f[fat][1]-min(f[x][0],f[x][1])); // //
for(int i=1;i<=Log[dep[x]-1];i++)fa[x][i]=fa[fa[x][i-1]][i-1],dp[x][i]=dp[x][i-1]*dp[fa[x][i-1]][i-1];
for(int i=head[x];i;i=edge[i].nxt)
if(edge[i].to!=fat)makedp(edge[i].to,x);
}
ll query(int x,bool ex,int y,bool ey)
{
if(dep[x]<dep[y])swap(x,y),swap(ex,ey);
VECTOR rx,ry;rx.V[0][ex]=f[x][ex];ry.V[0][ey]=f[y][ey];
for(;dep[x]>dep[y];x=fa[x][Log[dep[x]-dep[y]]])rx=rx*dp[x][Log[dep[x]-dep[y]]]; //
int lca;VECTOR rlca;
if(x==y)
{
lca=x;rlca.V[0][0]=rx.V[0][0];rlca.V[0][1]=rx.V[0][1];rlca.V[0][1^ey]=MAX;
for(;dep[lca]>1;lca=fa[lca][Log[dep[lca]-1]])rlca=rlca*dp[lca][Log[dep[lca]-1]];
return min(rlca.V[0][0],rlca.V[0][1]);
}
for(int i=Log[dep[x]-1];i>=0;i--)
if(fa[x][i]!=fa[y][i])rx=rx*dp[x][i],ry=ry*dp[y][i];
lca=fa[x][0];
rlca.V[0][0]=min(MAX,f[lca][0]-f[x][1]-f[y][1]+rx.V[0][1]+ry.V[0][1]);
rlca.V[0][1]=min(MAX,f[lca][1]-min(f[x][0],f[x][1])-min(f[y][0],f[y][1])+min(rx.V[0][0],rx.V[0][1])+min(ry.V[0][0],ry.V[0][1]));
for(;dep[lca]>1;lca=fa[lca][Log[dep[lca]-1]])rlca=rlca*dp[lca][Log[dep[lca]-1]];
return min(rlca.V[0][0],rlca.V[0][1]);
}
int main()
{
int n,m;string s;scanf("%d%d",&n,&m);getline(cin,s);
Log[0]=-1;for(int i=1;i<=n;i++)Log[i]=Log[i>>1]+1;
for(int i=1;i<=n;i++)scanf("%d",&p[i]);
for(int i=1;i<n;i++){int a,b;scanf("%d%d",&a,&b);Add(a,b);Add(b,a);}
makeF(1,0);makedp(1,0);
for(int i=1;i<=m;i++)
{
int a,x,b,y;scanf("%d%d%d%d",&a,&x,&b,&y);
if(x==0&&y==0&&(fa[a][0]==b||fa[b][0]==a)){printf("-1\n");continue;}
printf("%lld\n",query(a,x,b,y));
}
return 0;
}