#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long Int;

int n,m;
Int a[1001][1001];

///Subtask 2

struct Node
{
    Int sum,upd;
};

Node IT[410001];
int LEAFOFFSET=1;

void Refresh(int ver,int sz)
{
    if (IT[ver].upd!=0)
    {
        IT[ver].sum+=IT[ver].upd*(Int)sz;
        
        if (ver<=LEAFOFFSET)
        {
            IT[2*ver].upd+=IT[ver].upd;
            IT[2*ver+1].upd+=IT[ver].upd;
        }
        
        IT[ver].upd=0;
    }
    
    return;
}

void Upd(int ver,int L,int R,int l,int r,int val)
{
    Refresh(ver,R-L+1);
    
    if (L>r || R<l)
    return;
    else if (L>=l && R<=r)
    {
        IT[ver].upd+=(Int)val;
        
        Refresh(ver,R-L+1);
        
        return;
    }
    else
    {
        Upd(2*ver,L,(L+R)/2,l,r,val);
        Upd(2*ver+1,(L+R)/2+1,R,l,r,val);
        
        IT[ver].sum=IT[2*ver].sum+IT[2*ver+1].sum;
    }
    
    return;
}

void Update(int L,int R,int val)
{
    Upd(1,1,LEAFOFFSET+1,L,R,val);
    return;
}

Int Q(int ver,int L,int R,int l,int r)
{
    Refresh(ver,R-L+1);
    
    if (L>r || R<l)
    return 0;
    else if (L>=l && R<=r)
    {
        return IT[ver].sum;
    }
    else
    {
        return Q(2*ver,L,(L+R)/2,l,r)+Q(2*ver+1,(L+R)/2+1,R,l,r);
    }
}

Int Query(int L,int R)
{
    return Q(1,1,LEAFOFFSET+1,L,R);
}

int main()
{
    int i,j;
    int P,X,Y,V,Z,T;
    Int S=0;
    int L,R;
    int pL,pR;
    int k;
    
    scanf("%d %d",&n,&m);
    
    if (n<=1000 && m<=1000)
    {
        for (i=1;i<=m;i++)
        {
            scanf("%lld",&a[1][i]);
        }
        
        for (i=2;i<=n;i++)
        {
            scanf("%d %d %d %d %d %d",&P,&X,&Y,&V,&Z,&T);
            
            L=((X+S)%m)+1;
            R=((Y+S)%m)+1;
            pL=((Z+S)%m)+1;
            pR=((T+S)%m)+1;
            
            S=0;
            for (j=1;j<=m;j++)
            {
                if (j>=L && j<=R)
                {
                    a[i][j]=a[P][j]+(Int)V;
                }
                else
                {
                    a[i][j]=a[P][j];
                }
                
                if (j>=pL && j<=pR)
                S+=a[i][j];
            }
            
            printf("%lld\n",S);
            
            S=S%m;
        }
    }
    else
    {
        LEAFOFFSET=1;
        while(LEAFOFFSET<m)
        LEAFOFFSET*=2;
        LEAFOFFSET--;
        
        for (i=1;i<=m;i++)
        {
            scanf("%d",&k);
            Update(i,i,k);
        }
        
        for (i=2;i<=n;i++)
        {
            scanf("%d %d %d %d %d %d",&P,&X,&Y,&V,&Z,&T);
            
            L=((X+S)%m)+1;
            R=((Y+S)%m)+1;
            pL=((Z+S)%m)+1;
            pR=((T+S)%m)+1;
            
            Update(L,R,V);
            
            S=Query(pL,pR);
            
            printf("%lld\n",S);
            
            S=S%m;
        }
    }
    
    return 0;
}