#include <stdio.h>
#include <iostream>

using namespace std;

int x[100010];
long long mat[1111][1111];
long long AINT[4 * 100010], lazy[4 * 100010];

void build(int nod, int st, int dr) {
    if (st == dr)
        AINT[nod] = x[st];
    else {
        int m = (st + dr) / 2;
        build(2 * nod, st, m);
        build(2 * nod + 1, m + 1, dr);
        AINT[nod] = AINT[2 * nod] + AINT[2 * nod + 1];
    }
}

void push(int st, int dr, int nod) {
    if (st != dr) {
        int m = (st + dr) / 2;
        lazy[2 * nod] += lazy[nod];
        lazy[2 * nod + 1] += lazy[nod];
        AINT[2 * nod] += (m - st + 1) * lazy[nod];
        AINT[2 * nod + 1] += (dr - m) * lazy[nod];
    }
}

void update(int nod, int st, int dr, int qst, int qdr, int val) {
    if (qst <= st && dr <= qdr) {
        AINT[nod] += (dr - st + 1) * val;
        lazy[nod] = val;
        return ;
    }
    push(nod, st, dr);
    int m = (st + dr) / 2;
    if (qst <= m)
        update(2 * nod, st, m, qst, qdr, val);
    if (m < qdr)
        update(2 * nod + 1, m + 1, dr, qst, qdr, val);
    AINT[nod] = AINT[2 * nod] + AINT[2 * nod + 1];
}

long long query(int nod, int st, int dr, int qst, int qdr) {
    if (qst <= st && dr <= qdr)
        return AINT[nod];

    push(nod, st, dr);

    long long s = 0;
    int m = (st + dr) / 2;
    if (qst <= m)
        s += query(2 * nod, st, m, qst, qdr);
    if (m < qdr)
        s += query(2 * nod + 1, m + 1, dr, qst, qdr);
    return s;
}

int main() {
    //freopen("data.in", "r", stdin);
    //freopen("data.out", "w", stdout);

    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; ++i)
        scanf("%d", &x[i]);

    if (n <= 1000 && m <= 1000) {
        for (int i = 1; i <= m; ++i)
            mat[1][i] = x[i];
        long long s = 0;
        for (int i = 2; i <= n; ++i) {
            int where, st, dr, qst, qdr, val;
            scanf("%d%d%d%d%d%d", &where, &st, &dr, &val, &qst, &qdr);
            st = (st + s) % m + 1;
            dr = (dr + s) % m + 1;
            qst = (qst + s) % m + 1;
            qdr =  (qdr + s) % m + 1;
            for (int j = 1; j <= m; ++j)
                mat[i][j] = mat[where][j];
            for (int j = st; j <= dr; ++j)
                mat[i][j] += val;
            s = 0;
            for (int j = qst; j <= qdr; ++j)
                s += mat[i][j];
            printf("%lld\n", s);
        }
        return 0;
    }

    build(1, 1, m);
    long long s = 0;
    for (int i = 2; i <= n; ++i) {
        int where, st, dr, qst, qdr, val;
        scanf("%d%d%d%d%d%d", &where, &st, &dr, &val, &qst, &qdr);
        st = (st + s) % m + 1;
        dr = (dr + s) % m + 1;
        qst = (qst + s) % m + 1;
        qdr =  (qdr + s) % m + 1;
        update(1, 1, m, st, dr, val);
        s = query(1, 1, m, qst, qdr);
        printf("%lld\n", s);
    }

    return 0;
}
