#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
long long int tr[400000],upd[400000],st,ans[400000],m,sb=0;
struct edge { long long int to;
              long long int x,y,v,z,t; };
vector <edge> a[200000];
long long int change (long long int ind, long long int l, long long int r) {
    if (upd[ind]==0) return 0;
    if (ind<=st) {
       upd[2*ind+1]+=upd[ind];
       upd[2*ind+2]+=upd[ind];
       }
    tr[ind]+=upd[ind]*(r-l+1);
    upd[ind]=0;
    return 0;
}
long long int update (long long int ind, long long int l, long long int r, long long int from, long long int to, long long int incr) {
    long long int mid;
    change(ind,l,r);
    if ((l==from)&&(r==to)) {
       upd[ind]=incr;
       change(ind,l,r);
       return 0;
       }
    mid=(l+r)/2;
    if (from<=mid) update(2*ind+1,l,mid,from,min(to,mid),incr);
    if (to>mid) update(2*ind+2,mid+1,r,max(mid+1,from),to,incr);
    change(2*ind+1,l,mid); change(2*ind+2,mid+1,r);
    tr[ind]=tr[2*ind+1]+tr[2*ind+2];
    return 0;
}
long long int find (long long int ind, long long int l, long long int r, long long int from, long long int to) {
              long long int mid;
              change(ind,l,r);
              if ((l==from)&&(r==to)) {
                 sb+=tr[ind];
                 return 0;
                 }
              mid=(l+r)/2;
              if (from<=mid) find(2*ind+1,l,mid,from,min(to,mid));
              if (to>mid) find(2*ind+2,mid+1,r,max(mid+1,from),to);
              change(2*ind+1,l,mid); change(2*ind+2,mid+1,r);
              tr[ind]=tr[2*ind+1]+tr[2*ind+2];
              return 0;
}
long long int dfs (long long int vr, long long int s) {
    long long int i,l1,r1,l2,r2;
    ans[vr]=s;
    for (i=0; i<a[vr].size(); i++) {
        l1=(a[vr][i].x+s)%m; r1=(a[vr][i].y+s)%m; l2=(a[vr][i].z+s)%m; r2=(a[vr][i].t+s)%m;
        //cout << vr << " " << a[vr][i].to << " " << a[vr][i].x << " " << a[vr][i].y << " " << a[vr][i].z << " " << a[vr][i].t << endl ;
        update(0,0,st,l1,r1,a[vr][i].v);
        sb=0; find(0,0,st,l2,r2);
        dfs(a[vr][i].to,sb);
        update(0,0,st,l1,r1,-a[vr][i].v);
        }
}
int main () {
    long long int n,s=0,pr,x,y,incr,z,t,l1,r1,l2,r2,i,j;
    edge p;
    scanf("%lld%lld",&n,&m);
    st=1;
    for (;;) {
        if (st>=m) break;
        st*=2;
        }
    st--;
    for (i=0; i<m; i++) {
        scanf("%lld",&tr[st+i]);
        }
    for (i=st-1; i>=0; i--) {
        tr[i]=tr[2*i+1]+tr[2*i+2];// cout << tr[i] << " ";
        }
    for (i=0; i<n-1; i++) {
        scanf("%lld%lld%lld%lld%lld%lld",&pr,&p.x,&p.y,&p.v,&p.z,&p.t);
        p.to=i+1;
        a[pr-1].push_back(p);
        }
    dfs(0,0);
    for (i=0; i<n-1; i++) {
        printf("%lld\n",ans[i+1]);
        }
    return 0;
}
