k=3的都错了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
// #define ONLINE_JUDGE
// #define int long long
// #define long long long long
#define INPUT_DATA_TYPE long long
#define OUTPUT_DATA_TYPE long long
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){register char stack[40];register int i=0;if(x<0){x=-x;putchar('-');}if(x==0){putchar('0');return;}while(x){stack[i++]=x%10;x/=10;}while(i){putchar(stack[--i]+'0');}return;}
struct EDGE{
int to,next;
long long w;
EDGE(){
next=-1;
return;
}
}e[200010];
int tot,path[200010],fir[200010];
long long sum[200010],p[200010],q[200010],l[200010],dp[200010];
void addEdge(int u,int v,long long w){
e[tot].to=v;
e[tot].w=w;
e[tot].next=fir[u];
fir[u]=tot;
++tot;
return;
}
long long Y(int j){return dp[path[j]];}
long long X(int j){return sum[j];}
long long K(int i){return p[path[i]];}
long long B(int i){return -sum[i]*p[path[i]]-q[path[i]];}
bool checkslope(int a,int b,long long k){return Y(a)-Y(b)>k*(X(a)-X(b));}
// bool check(int a,int b,int c,int d){return ((((__int128)Y(a)-Y(b))*(X(c)-X(d))))<=((((__int128)Y(c)-Y(d))*1.0*(X(a)-X(b))));}
long double slope(int i,int j){return (X(i)-X(j)==0)?(1e9):((Y(i)-Y(j))*1.0/(X(i)-X(j)));}
bool check(int a,int b,int c,int d){return slope(a,b)<slope(c,d);}
struct S_NODE{
int tail,pos,point;
};
struct BST_NODE{
int *points,tail;
std::stack<S_NODE> backs;
void build(int len){
points=new int[len+2];
return;
}
BST_NODE(){
points=NULL;
return;
}
~BST_NODE(){
if(points!=NULL) delete(points);
points=NULL;
return;
}
void back(){
S_NODE q=backs.top();
backs.pop();
points[q.pos]=q.point;
tail=q.tail;
return;
}
void insert(int i){
if(tail==0){
points[++tail]=i;
backs.push((S_NODE){0,1,0});
}else{
register int l=1,r=tail,mid;
while(l<r){
mid=(l+r)>>1;
if(check(points[mid],points[mid+1],points[mid],i)) l=mid+1;
else r=mid;
}
backs.push((S_NODE){tail,l+1,points[l+1]});
points[l+1]=i;
tail=l+1;
}
return;
}
int getPoint(int i){
register int l=1,r=tail,mid;
while(l<r){
mid=(l+r)>>1;
if(checkslope(points[mid],points[mid+1],K(i))) l=mid+1;
else r=mid;
}
return points[l];
}
};
struct BST{
BST_NODE tree[200010];
int size;
inline int lowbit(int x){
return x&-x;
}
void insert(register int pos,int point){
pos=size-pos+1;
while(pos<=size){
if(tree[pos].points==NULL)
tree[pos].build(lowbit(pos));
tree[pos].insert(point);
pos+=lowbit(pos);
}
return;
}
void backto(register int pos){
pos=size-pos+1;
while(pos<=size){
tree[pos].back();
pos+=lowbit(pos);
}
return;
}
long long getAns(register int pos,int i){
long long ans=0x7fffffffffffffffll;
pos=size-pos+1;
register int point;
while(pos){
if(tree[pos].points!=NULL){
point=tree[pos].getPoint(i);
ans=std::min(ans,Y(point)-K(i)*X(point)-B(i));
}
pos-=lowbit(pos);
}
return ans;
}
}bit;
// int searchPoint(register int l,register int r,long long k){
// if(l==r) return l;
// register int mid;
// while(l<r){
// mid=(l+r)>>1;
// if(checkslope(Q[mid],Q[mid+1],k)) l=mid+1;
// else r=mid;
// }
// return l;
// }
void dfs(int u,int i){
register int j,head;
path[i]=u;
head=std::lower_bound(sum+1,sum+i,sum[i]-l[u])-sum;
if(u==1){
dp[u]=0;
}else{
dp[u]=bit.getAns(head,i);
}
bit.insert(i,i);
for(j=fir[u];~j;j=e[j].next){
sum[i+1]=sum[i]+e[j].w;
dfs(e[j].to,i+1);
}
bit.backto(i);
return;
}
signed main(){
// freopen("C:\\Users\\Administrator\\Downloads\\ticket6.in", "r", stdin);
// freopen("name.out", "w", stdout);
#ifndef ONLINE_JUDGE
freopen("name.in", "r", stdin);
freopen("name.out", "w", stdout);
#endif
memset(fir,-1,sizeof(fir));
register int i,t;
register long long t2;
int n=read();
bit.size=n;
int T=read();
for(i=2;i<=n;++i){
t=read();
t2=read();
addEdge(t,i,t2);
p[i]=read();
q[i]=read();
l[i]=read();
}
dfs(1,1);
for(i=2;i<=n;++i){
print(dp[i]);
putchar('\n');
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}