#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
long long int tr[400000],upd[400000],st,ans[400000],m;
struct edge { long long int to;
              long long int x,y,v,z,t; };
vector <edge> a[200000];
int change (int ind, int l, 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;
}
int update (int ind, int l, int r, int from, int to, long long int incr) {
    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 (int ind, int l, int r, int from, int to) {
              int mid;
              change(ind,l,r);
              if ((l==from)&&(r==to)) return tr[ind];
              mid=(l+r)/2;
              if ((from<=mid)&&(to>mid)) return find(2*ind+1,l,mid,from,min(to,mid))+find(2*ind+2,mid+1,r,max(mid+1,from),to);
              else if (from<=mid) return find(2*ind+1,l,mid,from,min(to,mid));
              else if (to>mid) return 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;
}
int dfs (int vr, int s) {
    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);
        dfs(a[vr][i].to,find(0,0,st,l2,r2));
        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;
}
