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

using namespace std;

const int MAXN = 100003;

struct node
{
    long long ad;
    long long val;
    node* l;
    node* r;
};

int a[MAXN], lv, rv;
long long v;
node* root[MAXN];

node* create_rmq(int lg, int rg)
{
    node* t = new node;
    t->ad = 0;
    if (lg == rg)
    {
        t->val = a[lg];
        t->l = t->r = NULL;
    }
    else
    {
        t->l = create_rmq(lg, (lg + rg) / 2);
        t->r = create_rmq((lg + rg) / 2 + 1, rg);
        t->val = t->l->val + t->r->val;
    }
    return t;
}

node* modify_rmq(node* t, int lg, int rg)
{
    node* ans;
    ans = new node;
    if ((lv <= lg) && (rg <= rv))
    {
        ans->val = t->val + v * (long long)(rg - lg + 1);
        ans->ad = t->ad + v;
        ans->l = t->l, ans->r = t->r;
    }
    else
    {
        ans->ad = t->ad;
        int md = (lg + rg) >> 1;
        if (lv <= md) ans->l = modify_rmq(t->l, lg, md);
        else ans->l = t->l;
        if (rv > md) ans->r = modify_rmq(t->r, md + 1, rg);
        else ans->r = t->r;
        ans->val = ans->l->val + ans->r->val + (ans->ad) * (long long)(rg - lg + 1);
    }
    return ans;
}

long long get_rmq(node* t, int lg, int rg)
{
    if ((lv <= lg) && (rg <= rv))
    {
        return t->val;
    }
    else
    {
        int md = ((lg + rg) >> 1);
        long long ans = 0;
        if (lv <= md) ans += get_rmq(t->l, lg, md);
        if (rv > md) ans += get_rmq(t->r, md + 1, rg);
        int vl = max(lg, lv), vr = min(rg, rv);
        ans += (t->ad) * (long long)(vr - vl + 1);
        return ans;
    }
}


int main()
{
#ifdef DEBUG
    freopen("input.txt", "r", stdin);
#endif
    int n, m, s = 0;
    scanf("%d%d",&n, &m);
    assert((n < 50000) && (m < 50000));
    for (int i = 0; i < m; i++) scanf("%d", &a[i]);
    root[0] = create_rmq(0, m - 1);
    for (int i= 1; i < n; i++)
    {
        int p, x, y, z, t;
        scanf("%d%d%d%lld%d%d", &p, &x, &y, &v, &z, &t);
        lv = (x + s) % m, rv = (y + s) % m;
        root[i] = modify_rmq(root[p - 1], 0, m - 1);
        lv = (z + s) % m, rv = (t + s) % m;
        long long ans = get_rmq(root[i], 0, m - 1);
        printf("%lld\n", ans);
        s = (ans % m);
    }
    return 0;
}
