最大点不带O2999ms极限卡过
难道是哪里写假了吗
#include<bits/stdc++.h>
#define Max 1000001
#define int long long
#define rt fa
#define pushdown spread
#define ls l
#define rs r
#define tim Times
#define add Add
#define s tot
#define a typ
using namespace std;
int l[Max],r[Max],tot[Max],dis[Max],fa[Max],born[Max];
int Add[Max],Times[Max];
bool typ[Max];int v[Max];
int die[Max],fin[Max],h[Max];
int depth[Max],father[Max];
int n,m;
void spread(int x)
{
if(Add[x]==0&&Times[x]==1)
return;
if(l[x])
{
Times[l[x]]*=Times[x];
Add[l[x]]*=Times[x];
Add[l[x]]+=Add[x];
tot[l[x]]*=Times[x];
tot[l[x]]+=Add[x];
}
if(r[x])
{
Times[r[x]]*=Times[x];
Add[r[x]]*=Times[x];
Add[r[x]]+=Add[x];
tot[r[x]]*=Times[x];
tot[r[x]]+=Add[x];
}
Times[x]=1,Add[x]=0;
}
int merge(int x,int y)
{
if(!x||!y)
return x+y;
spread(x),spread(y);
if(tot[y]<tot[x]) swap(x,y);
r[x]=merge(r[x],y);
if(dis[l[x]]<dis[r[x]]) swap(l[x],r[x]);
dis[x]=dis[l[x]]+1;
return x;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>h[i],fa[i]=-1;
depth[1]=1,dis[0]=-1;
for(int i=2;i<=n;i++)
{
cin>>father[i]>>typ[i]>>v[i];
depth[i]=depth[father[i]]+1;
}
for(int i=1;i<=m;i++)
{
cin>>tot[i]>>born[i];
Times[i]=1;
if(fa[born[i]]==-1) fa[born[i]]=i;
else fa[born[i]]=merge(fa[born[i]],i);
}
for(int i=n;i>=1;i--)
{
while(fa[i]!=-1)
{
if(tot[fa[i]]<h[i])
{
fin[fa[i]]=i;
spread(fa[i]);
if(!l[fa[i]]) fa[i]=-1;
else fa[i]=merge(l[fa[i]],r[fa[i]]);
}
else
break;
}
if(i==1) break;
if(fa[i]==-1) continue;
else
{
if(!typ[i]) tot[fa[i]]+=v[i],Add[fa[i]]+=v[i];
else tot[fa[i]]*=v[i],Times[fa[i]]*=v[i],Add[fa[i]]*=v[i];
spread(fa[i]);
if(fa[father[i]]==-1) fa[father[i]]=fa[i];
else fa[father[i]]=merge(fa[father[i]],fa[i]);
}
}
for(int i=1;i<=m;i++)
die[fin[i]]++;
for(int i=1;i<=n;i++)
cout<<die[i]<<endl;
for(int i=1;i<=m;i++)
cout<<depth[born[i]]-depth[fin[i]]<<endl;
}
/*
5 5
100
90 80 30 5
1 1 2
2 0 10
3 0 30
1 0 25
30 5
20 3
10 5
15 4
5 2
0
0
5
0
0
2
2
2
2
2
7 7
120 60 70 55 99 25 30
1 1 2
1 0 -10
1 0 15
2 0 25
3 1 2
3 0 30
100 1
45 2
55 3
60 4
35 5
30 6
30 7
*/