#include<fstream>
#include<iostream>
#include<cstdio>
#include<map>
#include<set>
#define FIT(a,b) for(vector<int>::iterator a=b.begin();a!=b.end();a++)
#include<stack>
#define ROF(a,b,c) for(int a=b;a>=c;--a)
#include<vector>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#define REP(a,b) for(int a=0;a<b;++a)
#include<cstring>
#include<bitset>
#include<cmath>
#include<iomanip>
#include<queue>
#define debug cerr<<"OK";
#define pii pair<int,int>
#define f cin
#define g cout
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
#define mod 1000000007
#define N 100100
#define NM 2000100
#define SQ 350
using namespace std;
/*ifstream f("a.in");
ofstream g("a.out");*/
/*int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};*/
long long H[NM];
int lef[NM],rig[NM];
int v[N],V,X,Y,Z,P,L,R,l,r,T,n,m,root[N],cnt;
long long S;
void build(int st,int dr,int nod)
{
    if(st==dr)
    {
        H[nod]=v[st];
        return ;
    }
    int mij=(st+dr)>>1;
    lef[nod]=++cnt;
    rig[nod]=++cnt;
    build(st,mij,lef[nod]);
    build(mij+1,dr,rig[nod]);
    H[nod]=H[lef[nod]]+H[rig[nod]];
}
void upd(int st,int dr,int pre,int cur)
{
    if(st>=L&&dr<=R)
    {
        H[cur]+=1LL*V*(dr-st+1);
        lef[cur]=lef[pre];
        rig[cur]=rig[pre];
        return ;
    }
    int mij=(st+dr)>>1;
    
    if(H[pre]!=H[lef[pre]]+H[rig[pre]])
    {
        lef[cur]=++cnt;
        rig[cur]=++cnt;
        long long dif=(H[pre]-(H[lef[pre]]+H[rig[pre]]))/(dr-st+1);
        H[lef[cur]]=H[lef[pre]]+dif*(mij-st+1);
        H[rig[cur]]=H[rig[pre]]+dif*(dr-mij);
        
        if(L<=mij)
        upd(st,mij,lef[pre],lef[cur]);
        if(R>mij)
        upd(mij+1,dr,rig[pre],rig[cur]);
    }
    else
    {
    if(L<=mij)
    {
        lef[cur]=++cnt;
        H[cnt]=H[lef[pre]];
        upd(st,mij,lef[pre],lef[cur]);
    }
    else
    lef[cur]=lef[pre];
    
    if(R>mij)
    {
        rig[cur]=++cnt;
        H[cnt]=H[rig[pre]];
        upd(mij+1,dr,rig[pre],rig[cur]);
    }
    else
    rig[cur]=rig[pre];
    }
    H[cur]=H[lef[cur]]+H[rig[cur]];
}
void find(int st,int dr,int nod,long long carry)
{
    if(st>=l&&dr<=r)
    {
        S+=H[nod]+1LL*carry*(dr-st+1);
        return ;
    }
    int mij=(st+dr)>>1;
    long long curc=carry;
    if(H[nod]!=H[lef[nod]]+H[rig[nod]])
        curc+=(H[nod]-H[lef[nod]]-H[rig[nod]])/(dr-st+1);
    if(l<=mij)
        find(st,mij,lef[nod],curc);
    if(r>mij)
        find(mij+1,dr,rig[nod],curc);
}
int main ()
{
   /* freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);*/
    f>>m>>n;
    FOR(i,1,n)
        f>>v[i];
    build(1,n,0);
    FOR(i,1,m-1)
    {
        if(i==2)
        {
            i++;
            i--;
        }
        root[i]=++cnt;
        f>>P>>X>>Y>>V>>Z>>T;
        --P;
        H[root[i]]=H[root[P]];
        S%=n;
        L=(X+S)%n+1;
        R=(Y+S)%n+1;
        l=(Z+S)%n+1;
        r=(T+S)%n+1;
        upd(1,n,root[P],root[i]);
        S=0;
        find(1,n,root[i],0);
        g<<S<<"\n";
    }
    return 0;
}
//Look at me! Look at me! The monster inside me has grown this big!