#include <cstdio>
#include <vector>
#include <iostream>
#include <queue>

#define DEBUG true

using namespace std;

int n, m;
long long s;
int debugVal;

int firstWeight[100007];
long long tree[10000007];
int leaves[100007];

void calcLeaves(int x, int l, int r) {

    if(l == r) {
        leaves[l] = x;
        return;
    }

    calcLeaves(x * 2, l, (l + r) / 2);
    calcLeaves(x * 2 + 1, (l + r) / 2 + 1, r);
}

void initTree(int x, int l, int r) {
    int mid = (l + r) / 2;
    if(mid != l) {
        initTree(x * 2, l, mid);
        initTree(x * 2 + 1, mid + 1, r);
    }
    tree[x] = tree[x * 2] + tree[x * 2 + 1];
}

void initTree() {
   // printf("M - %d", m);
    calcLeaves(1, 1, m);
    for(int i = 0 ; i < m; i++) {
        tree[leaves[i]] = firstWeight[i];
    }
    initTree(1, 1, m);
}

void updateInt(int x, int l, int r, int ul, int ur, int num) {
    //printf("Im in [%d %d %d], update for %d %d - %d\n", x, l, r, ul, ur, num);
    if(l >= ul && r <= ur) {
        int cnt = (r - l) + 1;
        //printf("Updating tree with %d\n", ((r - l) + 1) * num);
        tree[x] = tree[x] + (num * cnt);
        return;
    }
    int mid = (l + r) / 2;
    if(mid >= ul && r >= ul) {
        updateInt(x * 2, l, mid, ul, ur, num);
    }

    if(ur >= mid + 1 && l <= ur) {
        updateInt(x * 2 + 1, mid + 1, r , ul, ur, num);
    }
}

long long getSum(int x, int l, int r, int ul, int ur) {
   // printf("Im in [%d %d %d], search for %d %d\n", x, l, r, ul, ur);
    if(l >= ul && r <= ur) {
     //   printf("Returning %d\n", x);
        return tree[x];
    }
    long long sum = 0;
    int mid = (l + r) / 2;
    if(mid >= ul && r >= ul) {
        sum += getSum(x * 2, l, mid, ul, ur);
    }

    if(ur >= mid + 1 && l <= ur) {
        sum += getSum(x * 2 + 1, mid + 1, r, ul, ur);
    }

    return sum;
}

long long solve(int treeNum, int p, int x, int y,
           int v, int z, int t) {
    int l = ((x + s) % m) + 1;
    int r = ((y + s) % m) + 1;
    int findI = ((z + s) % m) + 1;
    int findJ = ((t + s) % m) + 1;

    if(treeNum == 1) {
      //  printf("m2 - ", m);
        initTree();
    }

    updateInt(1, 1, m, l, r, v);
    s = getSum(1, 1, m, findI, findJ);


    return s;
}


void read() {

    int foo, p, x, y, v, z, t;

    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; i++) {
        scanf("%d", &firstWeight[i]);
    }
    for(int i = 0; i < n; i++) {
        scanf("%d %d %d %d %d %d", &p, &x, &y, &v, &z, &t);
        printf("%lld\n", solve(i + 1, p, x, y, v, z,t));
    }
}

/*void calcTree(int num, int x, int y,
              int v, int from) {
    node root, copyNode = roots[from];
    root.left = copyNode.left;
    root.right = copyNode.right;
    root.das = debugVal++;
    roots[num] = root;
    int l = 1, r = m;
    queue<queueT> q;
    queueT a, b;
    node foo;
    a.cN = &root;
    a.l = 1;
    a.r = m;
    q.push(a);

    int mid;
    while(!q.empty()) {
        a = q.front();
        q.pop();
        printf("I'm in %d, %lld %lld\n", a.cN->das, a.cN->left->modifier, a.cN->right->modifier);
        mid = (a.l + a.r) / 2;
        if(a.l >= x && a.r <= y) {
            // Include the whole segment
            foo = *a.cN;
            foo.left->modifier += v;
            foo.right->modifier += v;
            continue;
        }
        // Check for left side
        if(x <= mid && mid <= y) {
            b.l = a.l;
            b.r = mid;
            b.cN = a.cN->left->to;
            b.cN->das = debugVal++;
            q.push(b);
        }

        if(mid + 1 >= x && mid + 1 <= y) {
            b.l = mid + 1;
            b.r = r;
            b.cN = a.cN->right->to;
            b.cN->das = debugVal++;
            q.push(b);
        }
    }
}*/


void debug() {
    if(!DEBUG)
        return;
    struct dd {
        int x;
    };

}


int main() {

    read();

    if(DEBUG)
        debug();

}
