#include<cstdio>
#include<vector>
#include<cstdlib>

struct node{
	node *l, *r;
	long long v;
	
	node() : l(0), r(0), v(0) {}
	node(node *cp) : l(cp->l), r(cp->r), v(cp->v) {}
};

int v[100005];

std::vector<node*> roots;

void update(node *nd, int l, int r, int a, int b, long long v){
	int m = (l + r) / 2;
	if(l == r){
		nd->v += v;
		return;
	} else if(b <= m){
		nd->l = new node(nd->l);
		update(nd->l, l, m, a, b, v);
	} else if(a >= m + 1){
		nd->r = new node(nd->r);
		update(nd->r, m + 1, r, a, b, v);
	} else {
		nd->l = new node(nd->l);
		nd->r = new node(nd->r);
		update(nd->l, l, m, a, m, v);
		update(nd->r, m + 1, r, m + 1, b, v);
	}
	nd->v = nd->l->v + nd->r->v;
}

long long query(node *nd, int l, int r, int a, int b) {
	int m = (l + r) / 2;
	if(l == a && r == b)
		return nd->v;
	if(b <= m)
		return query(nd->l, l, m, a, b);
	if(a >= m + 1)
		return query(nd->r, m + 1, r, a, b);
	else
		return query(nd->l, l, m, a, m) + query(nd->r, m + 1, r, m + 1, b);
}

void build(node *nd, int l, int r){
	int m = (l + r) / 2;
	if(l == r)
		nd->v = v[l];
	else {
		nd->l = new node;
		nd->r = new node;
		build(nd->l, l, m);
		build(nd->r, m + 1, r);
		nd->v = nd->l->v + nd->r->v;
	}
}

int main(void){
#ifdef ASDASD
	freopen("1.in", "r", stdin);
#endif
	int n;
	long long m;
	scanf("%d%lld", &n, &m);
	long long s = 0;

	roots.push_back(new node);
	for(int i = 0 ; i < m ; i++)
		scanf("%d", v + i);
	build(roots[0], 0, m - 1);
 
	while(--n){
		long long p, x, y, z, v, t;
		scanf("%lld%lld%lld%lld%lld%lld", &p, &x, &y, &v, &z, &t);
		long long l = (x + s) % m, r = (y + s) % m, i = (z + s) % m, j = (t + s) % m;
		//long long l = x, r = y, i = z, j = t;
		if(r < l) r = l;
		if(j < i) i = j; 
		roots.push_back(new node(roots[p - 1]));
		update(roots.back(), 0, m - 1, l, r, v);
		s = query(roots.back(), 0, m - 1, i, j);
		printf("%lld\n", s);
	}
	return 0;
}
