#include <stdio.h>

#include <vector>

using namespace std;

int n, m, lastv, left, right;
long long sp[100005];
vector <int> fiust[262150];
vector <int> fiudr[262150];
vector <long long> val[262150];
vector <long long> suma[262150];

void build (int nod, int st, int dr)
{
    fiust[nod].push_back (0);
    fiudr[nod].push_back (0);
    val[nod].push_back (0);
    suma[nod].push_back (0);
    if (st == dr)
        return;
    int m = (st + dr) >> 1;
    build (nod * 2, st, m);
    build (nod * 2 + 1, m + 1, dr);
}

void update (int nod, int ind, int st, int dr, int vval)
{
    fiust[nod].push_back (fiust[nod][ind]);
    fiudr[nod].push_back (fiudr[nod][ind]);
    val[nod].push_back (val[nod][ind]);
    suma[nod].push_back (suma[nod][ind]);
    
    int poz = val[nod].size() - 1;
    if (left <= st && dr <= right)
    {
        val[nod][poz] += vval;
        suma[nod][poz] += ((long long)dr - st + 1) * vval;
        return;
    }
    
    int m = (st + dr) >> 1;
    if (left <= m)
    {
        update (nod * 2, fiust[nod][ind], st, m, vval);
        fiust[nod][fiust[nod].size() - 1] = val[nod * 2].size() - 1;
    }
    if (m < right)
    {
        update (nod * 2 + 1, fiudr[nod][ind], m + 1, dr, vval);
        fiudr[nod][fiudr[nod].size() - 1] = val[nod * 2 + 1].size() - 1;
    }
    
    int indst, inddr;
    indst = fiust[nod].back();
    inddr = fiudr[nod].back();
    suma[nod][poz] = suma[nod * 2][indst] + suma[nod * 2 + 1][inddr] + ((long long)dr - st + 1) * val[nod].back();
}

long long query (int nod, int ind, int st, int dr, long long vval)
{
    if (left <= st && dr <= right)
        return suma[nod][ind] + ((long long)dr - st + 1) * vval;
    vval += val[nod][ind];
    int m = (st + dr) >> 1;
    long long suma = 0;
    if (left <= m)
        suma += query (nod * 2, fiust[nod][ind], st, m, vval);
    if (m < right)
        suma += query (nod * 2 + 1, fiudr[nod][ind], m + 1, dr, vval);
    return suma;
}

int main ()
{
#ifdef local
    freopen ("ants.in", "r", stdin);
    freopen ("ants.out", "w", stdout);
#endif

    scanf ("%d %d", &m, &n);
    
    int i, xx;
    for (i = 1; i <= n; i ++)
    {
        scanf ("%d", &xx);
        sp[i] = sp[i - 1] + xx;
    }
    scanf ("\n");
    long long lasts = 0;
    int j, p, x, y, val, z, t;
    lastv = 1;
    build (1, 1, n);
    char s[80];
    for (i = 2; i <= m; i ++)
    {
        //parsare
        gets (s + 1);
        p = x = y = val = z = t = 0;
        for (j = 1; s[j] != ' '; j ++)
            p = p * 10 + s[j] - '0';
        for (++ j; s[j] != ' '; j ++)
            x = x * 10 + s[j] - '0';
        for (++ j; s[j] != ' '; j ++)
            y = y * 10 + s[j] - '0';
        for (++ j; s[j] != ' '; j ++)
            val = val * 10 + s[j] - '0';
        for (++ j; s[j] != ' '; j ++)
            z = z * 10 + s[j] - '0';
        for (++ j; s[j]; j ++)
            t = t * 10 + s[j] - '0';
//        scanf ("%d %d %d %d %d %d", &p, &x, &y, &val, &z, &t);
        
        lastv = i;
        left = (x + lasts) % n + 1;
        right = (y + lasts) % n + 1;
        update (1, p - 1, 1, n, val);
        
        left = (z + lasts) % n + 1;
        right = (t + lasts) % n + 1;
        lasts = query (1, lastv - 1, 1, n, 0)+ sp[right] - sp[left - 1];
        printf ("%lld\n", lasts);
    }
    return 0;
}