int n, m, bl, tot; int a[kMaxN], bel[kMaxN], L[kMaxB], R[kMaxB], sz[kMaxB], suf[kMaxN], cnt5[kMaxB][kMaxB][kMaxB]; std::pair<int, int> b[kMaxN]; i64 cnt1[kMaxB], cnt2[kMaxB][kMaxB], cnt3[kMaxN], cnt4[kMaxN], cnt6[kMaxB][kMaxN];
/* cnt1[i] : 前 i 个块内部的逆序对数量和 cnt2[i][j] : 前 i 个块跟前 j 个块的逆序对数量和 cnt3[i] : i 到 i 所在块结尾这些数的逆序对数量 cnt4[i] : i 到 i 所在块开头这些数的逆序对数量 cnt5[i][j][k] : 第 i 个块前 j 个数到前 k 个数的逆序对数量 cnt6[i][j] : 前 i 个块跟前 j 个数的逆序对数量和 */
structBIT { int c[kMaxN];
voidupd(int x, int v){ for (; x <= n; x += x & -x) c[x] += v; }
intqry(int x){ int ret = 0; for (; x; x -= x & -x) ret += c[x]; return ret; } intqry(int l, int r){ returnqry(r) - qry(l - 1); } } bit;
i64 brute_force(int *a, int l1, int r1, int *b, int l2, int r2){ i64 ret = 0; int p = l2 - 1; for (int i = l1; i <= r1; ++i) { for (; p < r2 && b[p + 1] < a[i]; ++p) {} ret += p - l2 + 1; } return ret; }
voidprework(){ bl = sqrt(n), tot = (n - 1) / bl + 1; for (int i = 1; i <= n; ++i) b[i] = {a[i], i}; for (int i = 1; i <= tot; ++i) { L[i] = R[i - 1] + 1, R[i] = std::min(i * bl, n); std::sort(b + L[i], b + R[i] + 1); for (int j = L[i]; j <= R[i]; ++j) bel[j] = i; } for (int i = 1; i <= tot; ++i) { cnt1[i] = cnt1[i - 1]; for (int j = L[i]; j <= R[i]; ++j) for (int k = j + 1; k <= R[i]; ++k) if (a[j] > a[k]) ++cnt1[i], ++cnt5[i][j - L[i] + 1][k - L[i] + 1]; for (int j = 1; j <= bl; ++j) for (int k = 1; k <= bl; ++k) cnt5[i][j][k] += cnt5[i][j - 1][k] + cnt5[i][j][k - 1] - cnt5[i][j - 1][k - 1];
i64 query(int l, int r, int cs){ staticint tmpa[kMaxN], tmpb[kMaxN]; int x = bel[l], y = bel[r]; if (x == y) { int pl = l - L[x] + 1, pr = r - L[x] + 1; return cnt5[x][pr][pr] - cnt5[x][pl - 1][pr] - cnt5[x][pr][pl - 1] + cnt5[x][pl - 1][pl - 1]; } else { i64 ret = 0; ret += cnt3[l] + cnt4[r] + cnt1[y - 1] - cnt1[x]; ret += ((cnt2[y - 1][y - 1] - cnt2[x][y - 1]) - (cnt2[y - 1][x] - cnt2[x][x])) / 2; ret += (cnt6[y - 1][r] - cnt6[x][r]) - (cnt6[y - 1][L[y] - 1] - cnt6[x][L[y] - 1]); ret += (cnt6[y - 1][R[x]] - cnt6[x][R[x]]) - (cnt6[y - 1][l - 1] - cnt6[x][l - 1]); int ca = 0, cb = 0; for (int i = L[x]; i <= R[x]; ++i) if (b[i].second >= l && b[i].second <= R[x]) tmpa[++ca] = b[i].first; for (int i = L[y]; i <= R[y]; ++i) if (b[i].second >= L[y] && b[i].second <= r) tmpb[++cb] = b[i].first; ret += brute_force(tmpa, 1, ca, tmpb, 1, cb); return ret; } }
voiddickdreamer(){ std::cin >> n >> m; for (int i = 1; i <= n; ++i) std::cin >> a[i]; prework(); i64 lastans = 0; for (int i = 1; i <= m; ++i) { i64 l, r; std::cin >> l >> r; l ^= lastans, r ^= lastans; std::cout << (lastans = query(l, r, i)) << '\n'; } }