#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

typedef long long ll;

const int MAXN = 1e5;
const int MAXM = 1e5;

vector<vector<ll> > b;
ll n, m;

struct TNode {
    int L, R;
    int left, right;
    ll key;
    ll val;
};

TNode tree[2 * MAXM + 15];
int a[MAXM + 15];
int tc = 0;

int newNode(int L, int R) {
    tree[tc].L = L;
    tree[tc].R = R;
    tree[tc].left = -1;
    tree[tc].right = -1;
    tree[tc].key = 0;
    tree[tc].val = 0;
    
    return tc++;
}

int buildTree(int L, int R) {
    int root = newNode(L, R);
    
    if (R - L == 1) {
        tree[root].key = b[0][L];
        return root;
    }
    
    int M = (L + R) / 2;    
    int left = tree[root].left = buildTree(L, M);
    int right = tree[root].right = buildTree(M, R);
    
    tree[root].key = tree[left].key + tree[right].key;
    return root;
}

void setVal(int node, ll val) {
    if (node == -1) {
        return;
    }
    
    tree[node].val += val;
}

void push(int node) {
    tree[node].key += tree[node].val * ll(tree[node].R - tree[node].L);
    
    setVal(tree[node].left, tree[node].val);
    setVal(tree[node].right, tree[node].val);
    
    tree[node].val = 0;
}

void update_seq(int node, int v, int L, int R) {
    if (tree[node].R <= L || R <= tree[node].L) {
        return;
    }
    
    if (L <= tree[node].L && tree[node].R <= R) {
        setVal(node, v);
        return;
    }
    
    push(node);
    int left = tree[node].left;
    int right = tree[node].right;
   
    update_seq(left, v, L, R);
    update_seq(right, v, L, R);
    
    tree[node].key = tree[left].key + tree[right].key;
}

ll getSum(int node, int L, int R) {
    if (tree[node].R <= L || R <= tree[node].L) {
        return 0;
    }
    
    push(node);
    if (L <= tree[node].L && tree[node].R <= R) {
        return tree[node].key;
    }
    
    return getSum(tree[node].left, L, R) + getSum(tree[node].right, L, R);
}

int main() {
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    
    scanf("%lld%lld", &n, &m);
    
    bool cas = true;
    
    b.resize(n, vector<ll> (m));
    for (int i = 0; i < m; i++) {
        cin >> b[0][i];
    }
    
    vector<ll> p(n - 1), x(n - 1), y(n - 1), v(n - 1), z(n - 1), t(n - 1);
    for (int i = 0; i < n - 1; i++) {
        cin >> p[i] >> x[i] >> y[i] >> v[i] >> z[i] >> t[i];
        
        if (i > 0 && p[i - 1] + 1 != p[i]) {
            cas = false;
        }
    }
 
    if (!cas) {
        ll s = 0;
        for (int ii = 0; ii < n - 1; ii++) {            
            int L = (x[ii] + s) % m, R = (y[ii] + s) % m + 1;
            int i = (z[ii] + s) % m, j = (t[ii] + s) % m + 1;
            
            b[ii + 1] = b[p[ii] - 1];
            for (int k = L; k < R; k++) {
                b[ii + 1][k] += v[ii];
            }
            
            ll curs = 0;
            for (int k = i; k < j; k++) {
                curs += b[ii + 1][k];
            }
            
            s = curs;
            printf("%lld\n", s);
        }
    } else {    
        buildTree(0, m);
        
        ll s = 0;
        for (int ii = 0; ii < n - 1; ii++) {            
            ll L = (x[ii] + s) % m, R = (y[ii] + s) % m + 1;
            ll i = (z[ii] + s) % m, j = (t[ii] + s) % m + 1;
            
            update_seq(0, v[ii], L, R);
            s = getSum(0, i, j);
            printf("%lld\n", s);
        }
    }
}