提交时间:2023-12-06 09:02:51

运行 ID: 23963

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxn=1e5+10; inline int read(){ int x=0; short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,dfn[maxn],rnk[maxn],siz[maxn],w[maxn],val[maxn],bel[maxn],cnt; ull res1[maxn],res2[maxn]; vector<int>v[maxn]; void dfs(int u){ dfn[u]=++cnt,rnk[cnt]=u,siz[u]=1; for(int x:v[u])dfs(x),siz[u]+=siz[x]; } ll dp[maxn],dp2[maxn]; struct Querys { int l,r,id; }d[maxn]; bool operator<(Querys a,Querys b){ if(bel[a.l]!=bel[b.l])return bel[a.l]<bel[b.l]; return a.r<b.r; } void ins(int x,int OP=0){ if(x>n)x-=n; x=rnk[x]; if(OP==1){ down(i,m,w[x])dp2[i]=max(dp2[i],dp2[i-w[x]]+val[x]); return; } down(i,m,w[x])dp[i]=max(dp[i],dp[i-w[x]]+val[x]); } void slv2(){ up(i,0,m)dp[i]=0; //up(i,1,n)cout<<dfn[i]<<'\n'; up(i,1,n-1){ ins(i); ull res1=0,res2=0; up(j,0,m){ ull id=j+1; res1^=((ull)dp[j]*id); res2^=((ull)dp[j]*id*id*id); }printf("%llu %llu\n",res1,res2); } } void slv(){ n=read(),m=read(); int OP=read(); up(i,1,n)w[i]=w[i+n]=read(); up(i,1,n)val[i]=val[i+n]=read(); up(i,2,n){int fa=read();v[fa].p_b(i);} dfs(1); if(OP==1){ slv2(); return; } int len=sqrt(2*n); up(i,1,2*n)bel[i]=(i-1)/len+1; int q=0; up(i,2,n){ ++q; d[q].id=i,d[q].l=dfn[i]+siz[i],d[q].r=dfn[i]-1+n; }sort(d+1,d+q+1); int l=1,r=0; int lst=0; up(i,1,q){ if(bel[d[i].l]==bel[d[i].r]){ up(j,1,m)dp[j]=0; up(j,d[i].l,d[i].r)ins(j); res1[d[i].id]=res2[d[i].id]=0; up(j,0,m){ ull id=j+1; res1[d[i].id]^=((ull)dp[j]*id); res2[d[i].id]^=((ull)dp[j]*id*id*id); }continue; }if(bel[d[i].l]!=bel[d[lst].l]){ up(j,1,m)dp[j]=0; l=bel[d[i].l]*len+1,r=bel[d[i].l]*len; } while(r<d[i].r)ins(++r); up(j,0,m)dp2[j]=dp[j]; while(l>d[i].l)ins(--l,1);l=bel[d[i].l]*len+1; res1[d[i].id]=res2[d[i].id]=0; up(j,0,m){ ull id=j+1; res1[d[i].id]^=((ull)dp2[j]*id); res2[d[i].id]^=((ull)dp2[j]*id*id*id); }lst=i; }up(i,2,n)printf("%llu %llu\n",res1[i],res2[i]); } int main(){ // freopen("buffoonery.in","r",stdin); // freopen("buffoonery.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }