#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cassert>
#include <cmath>
#include <stack>
#include <queue>
#include <deque>


using namespace std;


typedef long long ll;
typedef double ld;

const int MAX_N = 110000;




int a[MAX_N];

int n, m;

ll s;


int cnt = 1;




int newn()
{
    return cnt++;
}

struct node
{
    int l, r;
    long long x;
    long long d;
    node()
    {
        l = 0;
        r = 0;
        x = 0;
        d = 0;
    }
};



node rmq[8000000];

int rt[MAX_N];


void build(int v, int tl, int tr)
{
    if (tl + 1 == tr)
    {
        rmq[v].x = a[tl];
        return;
    }
    int m = (tl + tr) >> 1;

    rmq[v].l = newn();
    rmq[v].r = newn();
    build(rmq[v].l, tl, m);
    build(rmq[v].r, m, tr);

    rmq[v].x = rmq[rmq[v].l].x + rmq[rmq[v].r].x;
}

void build()
{
    rt[0] = newn();
    build(rt[0], 0, m);
}



ll get(int v, int tl, int tr, int l, int r)
{
    if (r <= tl || tr <= l)
        return 0;
    if (l <= tl && tr <= r)
        return rmq[v].x;

    int m = (tl + tr) >> 1;

    ll dd = rmq[v].d * (min(tr, r) - max(tl, l));

    return get(rmq[v].l, tl, m, l, r) + get(rmq[v].r, m, tr, l, r) + dd;
}


ll get(int k, int l, int r)
{
    return get(rt[k], 0, m, l, r);
}



int add(int v, int tl, int tr, int l, int r, ll x)
{
    if (r <= tl || tr <= l)
        return v;
    if (l <= tl && tr <= r)
    {
        int k = newn();
        rmq[k] = rmq[v];
        rmq[k].d += x;
        rmq[k].x += (tr - tl) * x;
        return k;
    }


    int k = newn();
    rmq[k] = rmq[v];

    int m = (tl + tr) >> 1;

    rmq[k].l = add(rmq[v].l, tl, m, l, r, x);
    rmq[k].r = add(rmq[v].r, m, tr, l, r, x);

    rmq[k].x = rmq[rmq[k].l].x + rmq[rmq[k].r].x + rmq[k].d * (tr - tl);
    return k;
}


int main()
{
    scanf("%d%d", &n, &m);

    for (int i = 0; i < m; ++i)
        scanf("%d", &a[i]);


    build();



    for (int i = 1; i < n; ++i)
    {
        int x, y, v, z, t;
        int p;
        scanf("%d%d%d%d%d%d", &p, &x, &y, &v, &z, &t);
        --p;
        int l = (x + s) % m;
        int r = (y + s) % m;
        int ii = (z + s) % m;
        int jj = (t + s) % m;

        /*int p, l, r, v, ii, jj;
        cin >> p >>  l >> r >> v >> ii >> jj;
        --p;*/
        rt[i] = add(rt[p], 0, m, l, r + 1, v);


        s = get(i, ii, jj + 1);
        cout << s << "\n";

    }
    return 0;
}
