#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{
    int l, r;
    ll summ, add;
};

int lnum = 2, N, M;
vector<ptreenode> ptree;
vector<int> beg, version;

void build(int v, int l, int r){
    //cerr << v << " " <<
    if(l == r - 1){
        ptree[v].summ = beg[l];
        return;
    }
    ptreenode * pt = &ptree[v];
    int m = (l + r) >> 1;
    pt->l = lnum;
    lnum++;
    build(lnum - 1, l, m);
    pt->r = lnum;
    lnum++;
    build(lnum - 1, m, r);
    pt->summ = ptree[pt->l].summ + ptree[pt->r].summ;
    return;
}

void push(int v){
    ptree[lnum] = ptree[ptree[v].l];
    lnum++;
}

int L, R;
ll getrec(int v,int l, int r){
    ptreenode *pt = &ptree[v];
    int m = (l + r) >> 1;
    if(pt->add > 0){
        if(pt->l){
            ptree[lnum] = ptree[pt->l];
            pt->l = lnum;
            lnum++;
            ptree[lnum] = ptree[pt->r];
            pt->r = lnum;
            lnum++;
            ptree[pt->l].summ += pt->add * (m - l);
            ptree[pt->l].add += pt->add;
            ptree[pt->r].add += pt->add;
            ptree[pt->r].summ += pt->add * (r- m);
        }
        pt->add = 0;
    }
    if(L >= r || R <= l){
        return 0;
    }
    if(L <= l && R >= r){
        return pt->summ;
    }
    return getrec(pt->l, l, m) + getrec(pt->r, m, r);
}
ll get(int v){
    //L = l;
    //R = r;
    return getrec(version[v], 0, M);
}

int addrec(int v, int l, int r, ll val){
    ptreenode * pt = &ptree[v];
    int m = (l + r) >> 1;
    if(L >= r || R <= l){
        return v;
    }
    if(pt->add > 0){
        if(pt->l){
            ptree[lnum] = ptree[pt->l];
            pt->l = lnum;
            lnum++;
            ptree[lnum] = ptree[pt->r];
            pt->r = lnum;
            lnum++;
            ptree[pt->l].summ += pt->add * (m - l);
            ptree[pt->l].add += pt->add;
            ptree[pt->r].add += pt->add;
            ptree[pt->r].summ += pt->add * (r- m);
        }
        pt->add = 0;
    }
    //cerr << "created " << l << " " << r << " with number " << lnum << "\n";
    int nv = lnum;
    ptree[nv] = ptree[v];
    lnum++;
    assert(nv != v);
    ptreenode * ptn = &ptree[nv];
    assert(pt != ptn);
    if(L <= l && R >= r){
        ptn->summ += val * (r - l);
        ptn->add = val;
        return nv;
    }
    ptn->l = addrec(pt->l, l, m, val);
    ptn->r = addrec(pt->r, m, r, val);
    ptn->summ = ptree[ptn->l].summ + ptree[ptn->r].summ;
    return nv;
}
void add(int v, int newv, ll val){
    //L = l;
    //R = r;
    //cerr << "added " << val << " from " << L + 1 << " to " << R << "\n";
    version[newv] = addrec(version[v], 0, M, val);
}

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

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] = 1;
    ptree.resize(10000000);
    build(1, 0, M);
    for(int k = 0; k < M; k++){
        L = k;
        R = k + 1;
        //cerr << get(1) << " ";
    }
    //cerr << "\n";
    for(int i = 2; i <= N; i++){
        scanf("%d%d%d%d%d%d", &P, &X, &Y, &V, &Z, &T);
        L = (X + S) % M;
        R = (Y + S) % M + 1;
        add(P, i, V);
        L = (Z + S) % M;
        R = (T + S) % M + 1;
        S = get(i);
        for(int f = 1; f <= i; f++){
            for(int k = 0; k < M; k++){
                L = k;
                R = k + 1;
                //cerr << get(f) << " ";
            }
            //cerr << "\n";
        }
        cout << S << "\n";
    }
    for(int i = 1; i <= N; i++){
        //cerr << version[i] << " ";
    }
    return 0;
}
