#include <stdio.h>

struct vect
{
    long long val, suma;
};

int n, m;
long long sp[100005];
vect aint[262150];

void update (int nod, int st, int dr, int left, int right, int val)
{
    if (left <= st && dr <= right)
    {
        aint[nod].val += val;
        aint[nod].suma += ((long long)dr - st + 1) * val;
        return;
    }
    
    int m = (st + dr) >> 1;
    
    if (left <= m)
        update (nod * 2, st, m, left, right, val);
    if (m < right)
        update (nod * 2 + 1, m + 1, dr, left, right, val);
    aint[nod].suma = aint[nod * 2].suma + aint[nod * 2 + 1].suma;
}

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

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

    scanf ("%d %d", &m, &n);
    
    int i;
    for (i = 1; i <= n; i ++)
    {
        scanf ("%lld", &sp[i]);
        sp[i] += sp[i - 1];
    }
    
    long long lasts = 0;
    int p, x, y, val, z, t, st, dr, qx, qy;
    for (i = 2; i <= m; i ++)
    {
        scanf ("%d %d %d %d %d %d", &p, &x, &y, &val, &z, &t);
        st = (x + lasts) % n + 1;
        dr = (y + lasts) % n + 1;
        qx = (z + lasts) % n + 1;
        qy = (t + lasts) % n + 1;
        
        update (1, 1, n, st, dr, val);
        lasts = query (1, 1, n, qx, qy, 0)+ sp[qy] - sp[qx - 1];
        printf ("%lld\n", lasts);
    }
    return 0;
}