#include<iostream>
using namespace std;
const int max_n=1e6+7;
int n,m;
int a[max_n];
long long tree[max_n*2+100];
int lazy[max_n*2+100];
int s=0;
int build_tree(int node,int x,int y){
    if(x==y){
        return tree[node]=a[x];
    }
    int mid=(x+y)/2;
    tree[node]=(build_tree(node*2,x,mid) + build_tree(node*2+1,mid+1,y));
    return tree[node];
}
void update(int node, int a, int b,int l,int r,int v){
    if(lazy[node]){
        tree[node]+=lazy[node]*(b-a+1);
        if(a!=b){
            lazy[node*2]+=lazy[node];
            lazy[node*2+1]+=lazy[node];
        }
        lazy[node=0];
    }
    if(a>r||b<l||a>b)return;
    if(a>=l&&b<=r){
        tree[node]+=v*(a-b+1);
        lazy[node*2]+=v;
        lazy[node*2+1]+=v;
        return;
    }
    if(a==b){
        tree[node]+=v;
        return;
    }
    int mid=(a+b)/2;
    update(node*2,a,mid,l,r,v);
    update(node*2+1,mid+1,b,l,r,v);
    tree[node]=tree[node*2]+tree[node*2+1];
}
int find(int node,int a,int b,int l, int r){
    if(lazy[node]){
        tree[node]+=lazy[node]*(b-a+1);
        if(a!=b){
            lazy[node*2]+=lazy[node];
            lazy[node*2+1]+=lazy[node];
        }
        lazy[node]=0;
    }
    if(a>r||b<l||a>b) return 0;
    if(a>=l&&b<=r)return tree[node];
    int mid=(a+b)/2;
    if(a!=b)
        return find(node*2,a,mid,l,r)+find(node*2+1,mid+1,b,l,r);
    return tree[node];
}
void solve(int l,int r,int q, int w,int v){
    update(1,1,m,l,r,v);
    s=find(1,1,m,q,w);
    cout<<s<<endl;
}
void read(){
    int i;
    cin>>n>>m;
    for(i=1;i<=m;i++){
        cin>>a[i];
    }
    build_tree(1,1,m);
    int p,x,y,v,z,t;
    int l,r,q,w;
//    cout<<tree[1]<<endl;
    for(i=1;i<n;i++){
        cin>>p>>x>>y>>v>>z>>t;
        l=((x+s)%m)+1;
        r=((y+s)%m)+1;
        q=((z+s)%m)+1;
        w=((t+s)%m)+1;
        solve(l,r,q,w,v);
//        for(int j=1;j<=7;j++)cout<<tree[j]<<' ';
//        cout<<endl;
    }
}
int main()
{
    read();
return 0;
}
/*
4 4
3 6 7 5
1 2 3 1 0 1
2 1 2 6 2 2
1 0 2 8 0 3
*/