#include<iostream>
#include<stdio.h>
using namespace std;
long long int tr[400000],upd[400000],st,trs[2001][2001],upds[2001][2001],cur,sb;
long long int change (long long int ind, long long int l, long long int r, long long int tree) {
    if ((cur==1)&&(upd[ind]==0)) return 0;
    else if ((cur==2)&&(upds[tree][ind]==0)) return 0;
    if (ind<st) {
       if (cur==1) {
          upd[2*ind+1]+=upd[ind];
          upd[2*ind+2]+=upd[ind];
          }
       else { upds[tree][2*ind+1]+=upds[tree][ind];
              upds[tree][2*ind+2]+=upds[tree][ind]; }
       }
    if (cur==1) {
       tr[ind]+=upd[ind]*(r-l+1);
       upd[ind]=0;
       }
    else { trs[tree][ind]+=upds[tree][ind]*(r-l+1);
           upds[tree][ind]=0; }
    return 0;
}
long long int update (long long int ind, long long int l, long long int r, long long int from, long long int to, long long int incr, long long int tree) { //cout << l << " " << r << " " << from << " " << to << endl ;
    long long int mid;
    change(ind,l,r,tree);
    if ((l==from)&&(r==to)) {
       if (cur==1) upd[ind]=incr;
       else upds[tree][ind]=incr;
       change(ind,l,r,tree);
       return 0;
       }
    mid=(l+r)/2;
    if (from<=mid) update(2*ind+1,l,mid,from,min(to,mid),incr,tree);
    if (to>mid) update(2*ind+2,mid+1,r,max(mid+1,from),to,incr,tree);
    change(2*ind+1,l,mid,tree); change(2*ind+2,mid+1,r,tree);
    if (cur==1) tr[ind]=tr[2*ind+1]+tr[2*ind+2];
    else trs[tree][ind]=trs[tree][2*ind+1]+trs[tree][2*ind+2];
    return 0;
}
long long int find (long long int ind, long long int l, long long int r, long long int from, long long int to, long long int tree) { //cout << l << " " << r << " " << from << " " << to << endl ;
              long long int mid;
              change(ind,l,r,tree);
              if ((l==from)&&(r==to)) {
                 if (cur==1) sb+=tr[ind];
                 else sb+=trs[tree][ind];
                 return 0;
                 }
              mid=(l+r)/2;
              if (from<=mid) find(2*ind+1,l,mid,from,min(to,mid),tree);
              if (to>mid) find(2*ind+2,mid+1,r,max(mid+1,from),to,tree);
              change(2*ind+1,l,mid,tree); change(2*ind+2,mid+1,r,tree);
              if (cur==1) tr[ind]=tr[2*ind+1]+tr[2*ind+2];
              else trs[tree][ind]=trs[tree][2*ind+1]+trs[tree][2*ind+2];
              return 0;
}
int main () {
    long long int n,m,s=0,pr,x,y,incr,z,t,l1,r1,l2,r2,i,j;
    scanf("%lld%lld",&n,&m);
    if (m<=1000) cur=2;
    else cur=1;
    st=1;
    for (;;) {
        if (st>=m) break;
        st*=2;
        }
    st--;
    for (i=0; i<m; i++) {
        if (cur==1) scanf("%lld",&tr[st+i]);
        else scanf("%lld",&trs[0][st+i]);
        }
    for (i=st-1; i>=0; i--) {
        if (cur==1) tr[i]=tr[2*i+1]+tr[2*i+2];// cout << tr[i] << " ";
        else trs[0][i]=trs[0][2*i+1]+trs[0][2*i+2];
        }
    for (i=0; i<n-1; i++) {
        scanf("%lld%lld%lld%lld%lld%lld",&pr,&x,&y,&incr,&z,&t);
        l1=(x+s)%m+1; r1=(y+s)%m+1; l2=(z+s)%m+1; r2=(t+s)%m+1;
        l1--; r1--; l2--; r2--;
        if (cur==2) {
           for (j=0; j<st+m; j++) {
               trs[i+1][j]=trs[pr-1][j];
               upds[i+1][j]=upds[pr-1][j]; //cout << trs[i+1][j] << " ";
               }
           }
        //cout << x << " " << s << " " << m << " " << l1 << " " << r1 << " " << l2 << " " << r2 << endl ;
        update(0,0,st,l1,r1,incr,i+1);
        //cout << tr[0] << " ";
        sb=0; find(0,0,st,l2,r2,i+1);
        s=sb;
        printf("%lld\n",s);
        //if (i==0) s=12;
        }
    return 0;
}
