#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

const int N = 101000;

struct nod {
    int f1, f2;
    long long sum, vint;
};

int n, m, a[N], rad[N];

int val, poz1, poz2, q1, q2, nodc;
nod v[N * 100];

void build(int &no, int pozx, int pozy) {
    ++nodc;
    v[nodc] = v[no];
    no = nodc;
    
    if(pozx == pozy) {
        v[no].sum = a[pozx];
        return;
    }
    
    int mid = (pozx + pozy) / 2;
    
    build(v[no].f1, pozx, mid);
    build(v[no].f2, mid + 1, pozy);
    
    v[no].sum = v[v[no].f1].sum + v[v[no].f2].sum;
}

void update(int &no, int pozx, int pozy) {
    ++nodc;
    v[nodc] = v[no];
    no = nodc;
    
    if(pozx >= poz1 && poz2 >= pozy) {
        v[no].vint += val;
        v[no].sum += val * (pozy - pozx + 1);
        return;
    }
    
    int mid = (pozx + pozy) / 2;
    if(mid >= poz1)
        update(v[no].f1, pozx, mid);
    if(mid < poz2)
        update(v[no].f2, mid + 1, pozy);
    
    v[no].sum = v[v[no].f1].sum + v[v[no].f2].sum + v[no].vint * (pozy - pozx + 1);
}

long long rez = 0;

void query(int no, int pozx, int pozy) {
    if(pozx >= q1 && q2 >= pozy) {
        rez += v[no].sum;
        return;
    }
    
    int mid = (pozx + pozy) / 2;
    rez += v[no].vint * (min(pozy, q2) - max(pozx, q1) + 1);
    
    if(mid >= q1)
        query(v[no].f1, pozx, mid);
    if(mid < q2)
        query(v[no].f2, mid + 1, pozy);
}

int pp;
char aa[2000000];

inline int ter() {
    int r = 0;
    while(aa[pp] >= '0' && aa[pp] <= '9')
        r = r * 10 + aa[pp++] - '0';
    ++pp;
    return r;
}

int main() {
    int i;
    //freopen("ttt", "r", stdin);
    
    cin >> n >> m;
    cin.get();
    cin.getline(aa, 2000000);
    
    for(i = 1; i <= m; ++i)
        a[i] = ter();
    
        
    build(rad[1], 1, m);
    
    for(i = 2; i <= n; ++i) {
        int p, x, y, z, t;
        cin.getline(aa, 200);
        pp = 0;
        p = ter();
        x = ter();
        y = ter();
        val = ter();
        z = ter();
        t = ter();
        
        int ra = (rez % m);
        
        poz1 = (x + ra) % m + 1;
        poz2 = (y + ra) % m + 1;
        
        q1 = (z + ra) % m + 1;
        q2 = (t + ra) % m + 1;
        
        if(poz1 > poz2)
            swap(poz1, poz2);
        if(q1 > q2)
            swap(q1, q2);
        
        rad[i] = rad[p];
        update(rad[i], 1, m);
        
        rez = 0;
        query(rad[i], 1, m);
        
        cout << rez << "\n";
    }
    
    return 0;
}
