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

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)
{
    if ((rg < lv) || (lg > rv)) return t;
    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;
        ans->l = modify_rmq(t->l, lg, (lg + rg) / 2);
        ans->r = modify_rmq(t->r, (lg + rg) / 2 + 1, rg);
        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 ((rg < lv) || (lg > rv)) return 0;
    if ((lv <= lg) && (rg <= rv))
    {
        return t->val;
    }
    else
    {
        long long ans = get_rmq(t->l, lg, (lg + rg) / 2);
        ans += get_rmq(t->r, (lg + rg) / 2 + 1, rg);
        int vl = max(lg, lv), vr = min(rg, rv);
        ans += (t->ad) * (long long)(vr - vl + 1);
        return ans;
    }
}

void dfs(node* t, int space = 0)
{
    for (int i = 0; i < space; i++) cerr << " ";
    cerr << t->val << " " << t->ad << endl;
    if (t->l != NULL)
    {
        dfs(t->l, space + 2);
        dfs(t->r, space + 2);
    }
}

int main()
{
#ifdef DEBUG
    freopen("input.txt", "r", stdin);
#endif
    int n, m, s = 0;
    scanf("%d%d",&n, &m);
    for (int i = 0; i < m; i++) scanf("%d", &a[i]);
    root[0] = create_rmq(0, m - 1);
    //dfs(root[0]);
    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);
        //dfs(root[i]);
        lv = (z + s) % m, rv = (t + s) % m;
        long long ans = get_rmq(root[i], 0, m - 1);
        cout << ans << endl;
        s = (ans % m);
    }
    return 0;
}
