#include <bits/stdc++.h>
using namespace std;
int n, pos[200001];
struct node {
  node *l, *r;
  long long int lazy, lazy2;
};
node *root[200001];
int build(int s, int e, node *n) {
  if (s == e) {
    n->l = n->r = NULL;
    n->lazy = -1, n->lazy2 = 1;
    return 0;
  }
  int mid = (s + e) / 2;
  n->l = new node, n->r = new node;
  build(s, mid, n->l), build(mid + 1, e, n->r);
  n->lazy = n->lazy2 = 0;
  return 0;
}
pair<long long int, long long int> query(int s, int e, int q, node *n) {
  if (s == e) return make_pair(n->lazy, n->lazy2);
  int mid = (s + e) / 2;
  pair<long long int, long long int> p;
  if (q <= mid)
    p = query(s, mid, q, n->l);
  else
    p = query(mid + 1, e, q, n->r);
  return make_pair(p.first + n->lazy, p.second + n->lazy2);
}
int update(int s, int e, int as, int ae, node *o, node *n, int x, int t) {
  if ((s >= as) && (e <= ae)) {
    n->l = o->l, n->r = o->r;
    n->lazy = o->lazy + x, n->lazy2 = o->lazy2 + (long long int)x * t;
    return 0;
  }
  int mid = (s + e) / 2;
  if (ae <= mid) {
    n->r = o->r, n->l = new node;
    update(s, mid, as, ae, o->l, n->l, x, t);
  } else if (as > mid) {
    n->l = o->l, n->r = new node;
    update(mid + 1, e, as, ae, o->r, n->r, x, t);
  } else {
    n->l = new node, n->r = new node;
    update(s, mid, as, ae, o->l, n->l, x, t);
    update(mid + 1, e, as, ae, o->r, n->r, x, t);
  }
  n->lazy = o->lazy, n->lazy2 = o->lazy2;
  return 0;
}
int tree[1 << 19];
int build2(int s, int e, int i) {
  if (s == e) {
    tree[i] = -1;
    return 0;
  }
  int mid = (s + e) / 2;
  build2(s, mid, 2 * i + 1), build2(mid + 1, e, 2 * i + 2);
  tree[i] = -1;
  return 0;
}
int query2(int s, int e, int qs, int qe, int i) {
  if ((s > qe) || (e < qs))
    return 1e9;
  else if ((s >= qs) && (e <= qe))
    return tree[i];
  int mid = (s + e) / 2;
  return min(query2(s, mid, qs, qe, 2 * i + 1),
             query2(mid + 1, e, qs, qe, 2 * i + 2));
}
int update2(int s, int e, int ai, int i, int num) {
  if ((s > ai) || (e < ai))
    return 0;
  else if (s == e) {
    tree[i] = num;
    return 0;
  }
  int mid = (s + e) / 2;
  update2(s, mid, ai, 2 * i + 1, num), update2(mid + 1, e, ai, 2 * i + 2, num);
  tree[i] = min(tree[2 * i + 1], tree[2 * i + 2]);
  return 0;
}
int update3(int s, int e, int as, int ae, int i, int ol, int nl, int t) {
  if ((s > ae) || (e < as))
    return 0;
  else if (ol == nl)
    return 0;
  else if ((s >= as) && (e <= ae)) {
    if (s == e) {
      nl = min(nl, tree[i]), ol = min(ol, tree[i]);
      if (nl > ol) {
        node *r2 = new node;
        update(0, n, s, e, root[t + 1], r2, nl - ol, t);
        root[t + 1] = r2;
      }
      return 0;
    } else if (nl <= tree[i]) {
      node *r2 = new node;
      update(0, n, s, e, root[t + 1], r2, nl - ol, t);
      root[t + 1] = r2;
      return 0;
    }
  }
  int mid = (s + e) / 2;
  update3(s, mid, as, ae, 2 * i + 1, ol, nl, t);
  update3(mid + 1, e, as, ae, 2 * i + 2, min(ol, tree[2 * i + 1]),
          min(nl, tree[2 * i + 1]), t);
  return 0;
}
long long int getAns(int l, int r, int k) {
  if (k == -1) return (long long int)(r - l + 1) * (r - l + 2) / 2;
  int s = 0, e = r + 1;
  while (s < e) {
    int m = (s + e) / 2;
    pair<long long int, long long int> p = query(0, n, k, root[m + 1]);
    if (p.first < l)
      s = m + 1;
    else
      e = m;
  }
  if (s > r)
    return 0;
  else {
    pair<long long int, long long int> p = query(0, n, k, root[r + 1]);
    pair<long long int, long long int> p2 = query(0, n, k, root[s]);
    return (p.first * (r + 1) - p.second) - (p2.first * s - p2.second) -
           (long long int)(r - s + 1) * (l - 1);
  }
}
int main() {
  int i;
  int a, l, r, k;
  long long int lans = 0;
  scanf("%d", &n);
  for (i = 0; i <= n; i++) pos[i] = -1;
  root[0] = new node;
  build(0, n, root[0]), build2(0, n, 0);
  for (i = 0; i < n; i++) {
    scanf("%d %d %d %d", &a, &l, &r, &k);
    a = (a + lans) % (n + 1);
    l = (l + lans) % (i + 1);
    r = (r + lans) % (i + 1);
    if (l > r) swap(l, r);
    k = (k + lans) % (n + 1);
    int q = query2(0, n, 0, a, 0);
    if (q != pos[a])
      pos[a] = i, update2(0, n, a, 0, i), root[i + 1] = root[i];
    else {
      pos[a] = i, update2(0, n, a, 0, i);
      int q2 = query2(0, n, 0, a, 0);
      root[i + 1] = root[i];
      update3(0, n, a, n, 0, q, q2, i);
    }
    lans = getAns(l, r, k - 1) - getAns(l, r, k);
    printf("%I64d\n", lans);
  }
  return 0;
}
