#include <bits/stdc++.h>
#define fin cin
#define fout cout

using namespace std;

//ifstream fin("input.txt");
//ofstream fout("output.txt");

typedef long long ll;

const ll nmax = 110000;

struct ver
{
    ll val, add;
    
    ver()
    {
        val = 0;
        add = 0;
    }
};

ver T[4 * nmax];
ll a[nmax];
ll c[1100][1100];
ll p[nmax], x[nmax], y[nmax], v[nmax], z[nmax], t[nmax];
ll n, m, s;


void read()
{
    fin >> n >> m;
    for (ll i = 0; i < m; i++)
        fin >> a[i];
    for (ll i = 1; i < n; i++)
    {
        fin >> p[i] >> x[i] >> y[i] >> v[i] >> z[i] >> t[i];
        p[i]--;
    }
}


void build(ll i, ll l, ll r)
{
    T[i].add = 0;
    if (r <= l)
        return;
    if (r - l > 1)
    {
        ll m = (l + r + 1) / 2;
        build(2 * i, l, m);
        build(2 * i + 1, m, r);
        T[i].val = T[2 * i].val + T[2 * i + 1].val;
    }
    else
        T[i].val = a[l];
}


void update(ll i, ll lb, ll rb, ll l, ll r, ll v)
{
    if ((l >= rb) || (r <= lb))
        return;
    if ((l <= lb) && (r >= rb))
    {
        T[i].add += v;
        return;
    }
    ll m = (lb + rb + 1) / 2;
    update(2 * i, lb, m, l, r, v);
    update(2 * i + 1, m, rb, l, r, v);
    T[i].val = T[2 * i].val + T[2 * i + 1].val + T[2 * i].add * (m - lb) + T[2 * i + 1].add * (rb - m);
}


void push(ll i, ll l, ll r)
{
    T[2 * i].add += T[i].add;
    T[2 * i + 1].add += T[i].add;
    T[i].val += T[i].add * (r - l);
    T[i].add = 0;
}


ll get(ll i, ll lb, ll rb, ll l, ll r)
{
    //fout << i << ' ' << lb << ' ' << rb << ' ' << T[i].val << ' ' << T[i].add << endl;
    if ((lb >= r) || (l >= rb))
        return 0;
    push(i, lb, rb);
    if ((l <= lb) && (r >= rb))
        return T[i].val + T[i].add * (rb - lb);
    ll m = (lb + rb + 1) / 2;
    return get(2 * i, lb, m, l, r) + get(2 * i + 1, m, rb, l, r);
}


void solve()
{
    /*update(1, 0, m, 0, m, 100);
    update(1, 0, m, 2, 3, 1000);
    for (ll i = 0; i < m; i++)
        for (ll j = i + 1; j <= m; j++)
            fout << i << ' ' << j << ' ' << get(1, 0, m, i, j) << endl;*/
    s = 0;
    for (ll i = 1; i < n; i++)
    {
        assert(p[i] == i);
        ll l, r, ii, j;
        l = (x[i] + s) % m;
        r = (y[i] + s) % m;
        ii = (z[i] + s) % m;
        j = (t[i] + s) % m;
        update(1, 0, m, l, r + 1, v[i]);
        ll add = get(1, 0, m, ii, j + 1);
        fout << add << endl;
        s = add;
    }
}


void stupid_solve()
{
    s = 0;
    for (int i = 0; i < m; i++)
        c[0][i] = a[i];
    for (ll i = 1; i < n; i++)
    {
        ll l, r, ii, jj;
        l = (x[i] + s) % m;
        r = (y[i] + s) % m;
        ii = (z[i] + s) % m;
        jj = (t[i] + s) % m;
        //fout << x[i] << ' ' << y[i] << ' ' << z[i] << ' ' << t[i] << ' ' << "s " << s << endl;
        //fout << l << ' ' << r << ' ' << ii << ' ' << jj << endl;
        for (int j = 0; j < m; j++)
            c[i][j] = c[p[i]][j];
        for (int j = l; j <= r; j++)
            c[i][j] += v[i];
        //for (int j = 0; j < m; j++)
            //fout << c[i][j] << ' ';
        //fout << endl;
        //fout << ii << ' ' << jj << endl;
        ll ans = 0;
        for (int j = ii; j <= jj; j++)
            ans += c[i][j];
        fout << ans << endl;
        s = ans;
    }
}


int main()
{
    read();
    if ((n < 1000) && (m < 1000))
        stupid_solve();
    else
    {
        build(1, 0, m);
        solve();
    }
    return 0;
}
