#include <cstdio>
#include <iostream>
#include <vector>
#define DIM 100005
#define vint vector<int>::iterator

using namespace std;

vector<int> L[DIM];

struct aint {
    int v;
    int s;
} A[4*DIM];

int n, m, S, p, x, y, v, z, t;

int val, pos, a, b;

void build(int nod, int st, int dr) {
    if (st == dr) {
        A[nod].v = val;
        return;
    }
    int mid = (st + dr) / 2;
    if (pos <= mid)
        build(2 * nod, st, mid);
    else
        build(2 * nod + 1, mid + 1, dr);
    A[nod].v = A[2 * nod].v + A[2 * nod + 1].v;
}

void update(int nod, int st, int dr) {
    if (a <= st && dr <= b) {
        A[nod].s += val;
        A[nod].v += val * (dr - st + 1);
        return;
    }
    int mid = (st + dr) / 2;
    
    A[2 * nod].s += A[nod].s;
    A[2 * nod + 1].s += A[nod].s;
    A[2 * nod].v += A[nod].s * (mid - st + 1);
    A[2 * nod + 1].v += A[nod].s * (dr - mid);
    A[nod].s = 0;
    
    if (a <= mid)
        update(2 * nod, st, mid);
    if (mid < b)
        update(2 * nod + 1, mid + 1, dr);
    
    A[nod].v = A[2 * nod].v + A[2 * nod + 1].v;
}

void query(int nod, int st, int dr) {
    if (a <= st && dr <= b) {
        S += A[nod].v;
        return;
    }
    int mid = (st + dr) / 2;
    
    A[2 * nod].s += A[nod].s;
    A[2 * nod + 1].s += A[nod].s;
    A[2 * nod].v += A[nod].s * (mid - st + 1);
    A[2 * nod + 1].v += A[nod].s * (dr - mid);
    A[nod].s = 0;
    
    if (a <= mid)
        query(2 * nod, st, mid);
    if (mid < b)
        query(2 * nod + 1, mid + 1, dr);
}

int main() {
    
    cin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        cin >> val;
        pos = i;
        build(1, 1, m);
    }
    for (int i = 1; i < n; ++i) {
        cin >> p >> x >> y >> v >> z >> t;
        a = ((x + S) % m) + 1;
        b = ((y + S) % m) + 1;
        val = v;
        update(1, 1, n);
        a = ((z + S) % m) + 1;
        b = ((t + S) % m) + 1;
        S = 0;
        query(1, 1, n);
        cout << S << "\n";
    }
    return 0;
}

//Trust me, I'm the Doctor!