#include <bits/stdc++.h>
using namespace std;
const int M = 1 << 20;
const int N = 1e6 + 100;
int n, X;
vector<int> stree[M * 2];
int p[N], q[N];
int qu(int l1, int r1, int l2, int r2, int small = 0, int big = M - 1,
       int index = 1) {
  l1 = max(l1, small);
  r1 = min(r1, big);
  if (l1 > r1) return 0;
  if (small == l1 and big == r1)
    return upper_bound((stree[index]).begin(), (stree[index]).end(), r2) -
           lower_bound((stree[index]).begin(), (stree[index]).end(), l2);
  return qu(l1, r1, l2, r2, small, (small + big) / 2, 2 * index) +
         qu(l1, r1, l2, r2, (small + big) / 2 + 1, big, index * 2 + 1);
}
int main() {
  ios_base::sync_with_stdio(0);
  int tmp;
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> tmp;
    p[tmp] = i;
  }
  for (int i = 1; i <= n; ++i) {
    cin >> tmp;
    q[tmp] = i;
  }
  for (int i = 1; i <= n; ++i) stree[p[i] + M].push_back(q[i]);
  for (int i = M - 1; i >= 0; --i)
    merge((stree[i * 2]).begin(), (stree[i * 2]).end(),
          (stree[i * 2 + 1]).begin(), (stree[i * 2 + 1]).end(),
          back_inserter(stree[i]));
  int m, a, b, c, d;
  cin >> m;
  while (m--) {
    cin >> a >> b >> c >> d;
    int l1 = min(((((a)-1 + X) % n) + 1), ((((b)-1 + X) % n) + 1)),
        r1 = max(((((a)-1 + X) % n) + 1), ((((b)-1 + X) % n) + 1)),
        l2 = min(((((c)-1 + X) % n) + 1), ((((d)-1 + X) % n) + 1)),
        r2 = max(((((c)-1 + X) % n) + 1), ((((d)-1 + X) % n) + 1));
    X = qu(l1, r1, l2, r2);
    cout << X++ << endl;
  }
  return 0;
}
