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

struct Node
{
    Int sum,upd;
};

int LEAFOFFSET=1;

struct IT
{
    Node IT[270001];

    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)
    {
        //cout<<L<<"~"<<R<<" gets + "<<val<<endl;
        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);
        
        //cout<<"At "<<ver<<endl;
        //cout<<L<<"~"<<R<<endl;
        
        if (L>r || R<l)
        return 0;
        else if (L>=l && R<=r)
        {
            //cout<<"Adding "<<ver<<endl;
            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)
    {
        //cout<<"Getting query "<<L<<"~"<<R<<endl;
        return Q(1,1,LEAFOFFSET+1,L,R);
    }
};

IT HueHue[41];
int Trees=1;
int n,m;

int Saved[100001];
int ComeFrom[100001];
pair< int,pair<int,int> > Updated[100001];

vector<int> Path;

int GetPath(int t)
{
    if (Saved[t]!=0)
    return t;
    
    Path.push_back(t);
    
    return GetPath(ComeFrom[t]);
}

int LIMIT=20;

int main()
{
    //freopen("test.txt","r",stdin);
    
    int i,j;
    int k;
    int P,X,Y,V,Z,T;
    int Chosen;
    int L,R,pL,pR;
    Int S=0;
    
    memset(Saved,0,sizeof(Saved));
    Saved[1]=1;
    
    scanf("%d %d",&n,&m);
    
    LEAFOFFSET=1;
    while(LEAFOFFSET<m)
    LEAFOFFSET*=2;
    LEAFOFFSET--;
    
    for (i=1;i<=m;i++)
    {
        scanf("%d",&k);
        
        HueHue[1].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;
        
        Path.clear();
        
        Chosen=Saved[ GetPath(P) ];
        
        //cout<<"Chosen is "<<Chosen<<endl;
        
        for (j=(int)Path.size()-1;j>=0;j--)
        {
            HueHue[Chosen].Update( Updated[ Path[j] ].second.first , Updated[ Path[j] ].second.second , Updated[ Path[j] ].first );
        }
        
        HueHue[Chosen].Update(L,R,V);
        
        S=HueHue[Chosen].Query(pL,pR);
        
        if ((int)Path.size()>LIMIT && Trees<40)
        {
            Trees++;
            for (j=1;j<=2*LEAFOFFSET+1;j++)
            {
                HueHue[Trees].IT[j]=HueHue[Chosen].IT[j];
            }
            
            Saved[i]=Trees;
        }
        
        HueHue[Chosen].Update(L,R,-V);
        
        for (j=0;j<(int)Path.size();j++)
        {
            HueHue[Chosen].Update( Updated[ Path[j] ].second.first , Updated[ Path[j] ].second.second , -Updated[ Path[j] ].first );
        }
        
        ComeFrom[i]=P;
        Updated[i]=make_pair(V,make_pair(L,R));
        
        printf("%lld\n",S);
        
        S=S%m;
    }
    
    return 0;
}















