#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cassert>

typedef long long ll;
typedef long double ld;

using namespace std;

struct ptreenode{
    ll summ, add;
    ptreenode *l, *r;
};

int N, M;
vector<int> beg;
vector<ptreenode*> version;

void build(ptreenode *pt, int l, int r){
    if(l + 1 == r){
        pt->summ = beg[l];
        return;
    }
    int m = (l + r) >> 1;
    pt->l = new ptreenode;
    build(pt->l, l, m);
    pt->r = new ptreenode;
    build(pt->r, m, r);
    pt->summ = pt->l->summ + pt->r->summ;
}

int L, R;

inline void push(ptreenode *pt, int d){
    if(pt->add && pt->r != NULL){
        pt->l = new ptreenode(*(pt->l));
        pt->r = new ptreenode(*(pt->r));
        pt->l->summ += pt->add * d;
        pt->r->summ += pt->add * d;
        pt->r->add += pt->add;
        pt->r->add += pt->add;
    }
    pt->add = 0;
}

ll get(ptreenode *pt, int l, int r){
    int m = (l + r) >> 1;
    push(pt, m - l);
    if(L >= r || R <= l){
        return 0;
    }
    if(L <= l && R >= r){
        return pt->summ;
    }
    return get(pt->l, l, m) + get(pt->r, m, r);
}

ll val;

ptreenode* add(ptreenode *pt, int l, int r){
    if(L >= r || R <= l){
        return pt;
    }
    int m = (l + r) >> 1;
    push(pt, m - l);
    ptreenode * npt = new ptreenode(*pt);
    if(L <= l && R >= r){
        npt->summ += val * (r - l);
        npt->add += val;
        return npt;
    }
    npt->l = add(pt->l, l, m);
    npt->r = add(pt->r, m, r);
    npt->summ = npt->r->summ + npt->l->summ;
    return npt;
}

ll S;
int P, X, Y, V, Z, T;

int main() {
#ifdef DEBUG
    freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
#else
    //freopen("test.in", "r", stdin);
    //freopen("test.out", "r", stdout);
#endif
    cin >> N >> M;
    beg.resize(N);
    version.resize(N + 1);
    for(int i = 0; i < M; i++){
        scanf("%d", &beg[i]);
    }
    version[1] = new ptreenode;
    build(version[1], 0, M);
    /*for(int k = 0; k < M; k++){
        L = k;
        R = k + 1;
        cerr << get(version[1], 0, M) << " ";
    }
    cerr << "\n";*/
    for(int i = 2; i <= N; i++){
        scanf("%d%d%d%d%d%d", &P, &X, &Y, &V, &Z, &T);
        L = (S + X) % M;
        R = (S + Y) % M + 1;
        val = V;
        version[i] = add(version[P], 0, M);
        L = (S + Z) % M;
        R = (S + T) % M + 1;
        S = get(version[i], 0, M);
        /*for(int f = 1; f <= i; f++){
            for(int k = 0; k < M; k++){
                L = k;
                R = k + 1;
                cerr << get(version[f], 0, M) << " ";
            }
            cerr << "\n";
        }*/
        cout << S << "\n";
    }
    for(int i = 1; i <= N; i++){
        //cerr << version[i] << " ";
    }
    return 0;
}

/*
4 4
3 6 7 5
1 2 3 1 0 1
2 1 2 6 2 2
1 0 2 8 0 3
*/
