rt,KTT 卡疯了,一直 TLE on #10。
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define N 200006
using namespace std;
constexpr int INF=1e18;
int n,q,dfs_clock,a[N],b[N],dfn[N],id[N],sa[N],sb[N],sz[N];
vector<int> G[N];
inline int read()
{
int ret=0,f=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+(ch^48),ch=getchar();
return ret*f;
}
inline void write(int k)
{
if(k<0)putchar('-'),k=-k;
static int nnum[20],ttp=0;
while(k)nnum[++ttp]=k%10,k/=10;
if(!ttp)nnum[++ttp]=0;
while(ttp)putchar(nnum[ttp--]^48);
}
void dfs(int u,int suma,int sumb)
{
sz[u]=1,id[dfn[u]=++dfs_clock]=u;
sa[u]=(suma+=a[u]),sb[u]=abs(sumb+=b[u]);
for(int v:G[u])dfs(v,suma,sumb),sz[u]+=sz[v];
}
struct KTT{
int tag[N<<2];
struct Line{int k,b,lim;}tree[N<<2];
pair<Line,int> Max(Line x,Line y)
{
if(x.b<y.b)swap(x,y);
if(x.k>=y.k)return make_pair(x,INF);
return make_pair(x,(x.b-y.b)/(x.k-y.k));
}
void push_up(int p)
{
pair<Line,int> t=Max(tree[p<<1],tree[p<<1|1]);
tree[p]={t.first.k,t.first.b,
min({tree[p<<1].lim,tree[p<<1|1].lim,t.second})};
}
void build(int p,int l,int r,int o)
{
if(l==r)return tree[p].k=sb[id[l]]*o,tree[p].b=tree[p].k*sa[id[l]],tree[p].lim=INF,(void)0;
int mid=l+r>>1;build(p<<1,l,mid,o),build(p<<1|1,mid+1,r,o);
push_up(p);
}
void push_down(int p)
{
if(!tag[p])return;
tree[p<<1].b+=tree[p<<1].k*tag[p];
tree[p<<1|1].b+=tree[p<<1|1].k*tag[p];
tag[p<<1]+=tag[p],tag[p<<1|1]+=tag[p];
tree[p<<1].lim-=tag[p],tree[p<<1|1].lim-=tag[p],tag[p]=0;
}
void update(int p,int l,int r,int L,int R,int x)
{
if(L<=l&&r<=R&&tree[p].lim>=x)
return tree[p].b+=tree[p].k*x,tag[p]+=x,tree[p].lim-=x,(void)0;
push_down(p);int mid=l+r>>1;
if(L<=mid)update(p<<1,l,mid,L,R,x);
if(R>mid)update(p<<1|1,mid+1,r,L,R,x);
push_up(p);
}
int query(int p,int l,int r,int L,int R)
{
if(L<=l&&r<=R)return tree[p].b;
push_down(p);int mid=l+r>>1,ret=0;
if(L<=mid)ret=max(ret,query(p<<1,l,mid,L,R));
if(R>mid)ret=max(ret,query(p<<1|1,mid+1,r,L,R));
return ret;
}
}T1,T2;
main()
{
n=read(),q=read();
for(int i=2;i<=n;i++)G[read()].push_back(i);
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)b[i]=read();
dfs(1,0,0),T1.build(1,1,n,1),T2.build(1,1,n,-1);
while(q--)
{
int opt=read(),u=read(),x;
if(opt==1)x=read(),T1.update(1,1,n,dfn[u],dfn[u]+sz[u]-1,x),
T2.update(1,1,n,dfn[u],dfn[u]+sz[u]-1,x);
else write(max(T1.query(1,1,n,dfn[u],dfn[u]+sz[u]-1),
T2.query(1,1,n,dfn[u],dfn[u]+sz[u]-1))),putchar(10);
}
return 0;
}