#pragma GCC optimize("O3","unroll-loops", "inline-functions", "Ofast", "-funroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define FORD(i, a, b) for (int i = (a), _b = (b); i >= _b; --i)
#define REP(i, n) for (int i = (0), _n = (n); i < _n; ++i)
#define el cout << '\n'
//--FastIO-------------------------------------------------------------------------------------
static constexpr int SIZE = 1 << 16;
char buffer[SIZE];
int cpos = SIZE, clen = SIZE;
inline int InChar()
{
if (cpos == clen)
{
clen = (int) fread(buffer, 1, SIZE, stdin);
if (clen == 0) return EOF;
cpos = 0;
}
return buffer[cpos++];
}
inline int ReadInt()
{
int x = 0, p = 1;
char c = InChar();
while (c != EOF && !isdigit(c) && c != '-') c = InChar();
if (c == '-') p = -1, c = InChar();
while (c != EOF && isdigit(c)) x = x * 10 + (c - 48), c = InChar();
return x * p;
}
constexpr int MAXN = 1e5 + 2, BLOCK_SZ = 400;
int n, q;
int a[MAXN];
long long inv[min(600, MAXN / BLOCK_SZ) + 1][min(600, MAXN / BLOCK_SZ) + 1];
void load_input(void)
{
n = ReadInt();
q = ReadInt();
FOR(i, 1, n) a[i] = ReadInt();
}
int BIT[MAXN];
void add_point(int id, int val)
{
for (; id > 0; id -= id & -id) BIT[id] += val;
}
int sum_suffix(int id)
{
int res = 0;
for (; id > 0 && id <= n; id += id & -id) res += BIT[id];
return res;
}
int sub_inv_pref[MAXN], sub_inv_suff[MAXN];
int cnt[min(600, MAXN / BLOCK_SZ) + 1][MAXN];
pair <int, int> blk_sorted[MAXN];
void prepare(void)
{
int num_block = n / BLOCK_SZ;
FOR(i, 1, n) cnt[i / BLOCK_SZ][a[i]]++;
REP(id, num_block + 1)
{
FOR(x, 1, n) cnt[id][x] += cnt[id][x - 1];
if (id) FOR(x, 1, n) cnt[id][x] += cnt[id - 1][x];
int start = max(1, id * BLOCK_SZ), end = min(n, (id + 1) * BLOCK_SZ - 1);
FOR(i, start, end) blk_sorted[i] = make_pair(a[i], i);
sort(blk_sorted + start, blk_sorted + end + 1);
add_point(a[start], 1);
FOR(i, start + 1, end)
{
sub_inv_pref[i] = sub_inv_pref[i - 1] + sum_suffix(a[i] + 1);
add_point(a[i], 1);
}
FOR(i, start, end) add_point(a[i], -1);
add_point(a[end], 1);
FORD(i, end - 1, start)
{
sub_inv_suff[i] = sub_inv_suff[i + 1] + end - i - sum_suffix(a[i]);
add_point(a[i], 1);
}
FOR(i, start, end) add_point(a[i], -1);
}
REP(id, num_block + 1)
{
long long d = 0, tmp = 0;
int start = max(1, id * BLOCK_SZ);
int cur_id = id, step = id ? 0 : 1;
FOR(i, start, n)
{
++step;
if (step > BLOCK_SZ)
{
step = 1;
++cur_id;
tmp += sub_inv_pref[i - 1];
}
int pre_id = cur_id - 1;
if (id <= pre_id)
d += (cnt[pre_id][n] - cnt[pre_id][a[i]]) - (id ? (cnt[id - 1][n] - cnt[id - 1][a[i]]) : 0);
inv[id][cur_id] = d + tmp + sub_inv_pref[i];
}
}
}
int small_arr[BLOCK_SZ * 2 + 5];
int small_temp[BLOCK_SZ * 2 + 5];
long long merge_sort(int l, int r) {
if (l >= r) return 0;
int mid = l + (r - l) / 2;
long long res = merge_sort(l, mid) + merge_sort(mid + 1, r);
int i = l, j = mid + 1, k = l;
while (i <= mid && j <= r) {
if (small_arr[i] <= small_arr[j]) small_temp[k++] = small_arr[i++];
else {
small_temp[k++] = small_arr[j++];
res += (mid - i + 1);
}
}
while (i <= mid) small_temp[k++] = small_arr[i++];
while (j <= r) small_temp[k++] = small_arr[j++];
FOR(p, l, r) small_arr[p] = small_temp[p];
return res;
}
int arr[BLOCK_SZ + 2];
long long calc(int l, int r)
{
int id_l = l / BLOCK_SZ, id_r = r / BLOCK_SZ;
if (id_r - id_l < 2)
{
int len = r - l + 1;
FOR(i, 0, len - 1) small_arr[i] = a[l + i];
return merge_sort(0, len - 1);
}
long long res = sub_inv_suff[l] + inv[id_l + 1][id_r - 1] + sub_inv_pref[r];
int sz = 0;
FOR(i, max(l, id_r * BLOCK_SZ), min(n, (id_r + 1) * BLOCK_SZ - 1))
{
auto [val, idx] = blk_sorted[i];
if (idx > r) continue;
arr[++sz] = val;
res += (cnt[id_r - 1][n] - cnt[id_r - 1][val]) - (cnt[id_l][n] - cnt[id_l][val]);
}
int ptr = 1;
FOR(i, max(1, id_l * BLOCK_SZ), min((id_l + 1) * BLOCK_SZ - 1, r))
{
auto [val, idx] = blk_sorted[i];
if (idx < l) continue;
while (ptr <= sz && arr[ptr] < val) ++ptr;
res += ptr - 1;
res += (cnt[id_r - 1][val - 1] - cnt[id_l][val - 1]);
}
return res;
}
void process(void)
{
prepare();
// cout << calc(1, 8); exit(0);
ostringstream oss;
long long last = 0;
while (q--)
{
int l, r;
l = ReadInt();
r = ReadInt();
l = (last + l) % n + 1;
r = (last + r) % n + 1;
if (l > r) swap(l, r);
// cerr << l << ' ' << r << '\n';
oss << (last = calc(l, r)) << '\n';
}
cout << oss.str();
}
signed main(void)
{
int testcase = 1;
while (testcase--)
{
load_input();
process();
}
cerr << "Done!";
return 0;
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIiwidW5yb2xsLWxvb3BzIiwgImlubGluZS1mdW5jdGlvbnMiLCAiT2Zhc3QiLCAiLWZ1bnJvbGwtbG9vcHMiKQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIEZPUihpLCBhLCBiKSAgICAgICAgZm9yIChpbnQgaSA9IChhKSwgX2IgPSAoYik7IGkgPD0gX2I7ICsraSkKI2RlZmluZSBGT1JEKGksIGEsIGIpICAgICAgIGZvciAoaW50IGkgPSAoYSksIF9iID0gKGIpOyBpID49IF9iOyAtLWkpCiNkZWZpbmUgUkVQKGksIG4pICAgICAgICAgICBmb3IgKGludCBpID0gKDApLCBfbiA9IChuKTsgaSA8IF9uOyArK2kpCiNkZWZpbmUgZWwgICAgICAgICAgICAgICAgICBjb3V0IDw8ICdcbicKICAgICAgICAKLy8tLUZhc3RJTy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyBjb25zdGV4cHIgaW50IFNJWkUgPSAxIDw8IDE2OwpjaGFyIGJ1ZmZlcltTSVpFXTsKaW50IGNwb3MgPSBTSVpFLCBjbGVuID0gU0laRTsKCmlubGluZSBpbnQgSW5DaGFyKCkKewogICAgaWYgKGNwb3MgPT0gY2xlbikKICAgIHsKICAgICAgICBjbGVuID0gKGludCkgZnJlYWQoYnVmZmVyLCAxLCBTSVpFLCBzdGRpbik7CiAgICAgICAgaWYgKGNsZW4gPT0gMCkgcmV0dXJuIEVPRjsKICAgICAgICBjcG9zID0gMDsKICAgIH0KICAgIHJldHVybiBidWZmZXJbY3BvcysrXTsKfQoKaW5saW5lIGludCBSZWFkSW50KCkKewogICAgaW50IHggPSAwLCBwID0gMTsKICAgIGNoYXIgYyA9IEluQ2hhcigpOwogICAgd2hpbGUgKGMgIT0gRU9GICYmICFpc2RpZ2l0KGMpICYmIGMgIT0gJy0nKSBjID0gSW5DaGFyKCk7CiAgICBpZiAoYyA9PSAnLScpIHAgPSAtMSwgYyA9IEluQ2hhcigpOwogICAgd2hpbGUgKGMgIT0gRU9GICYmIGlzZGlnaXQoYykpIHggPSB4ICogMTAgKyAoYyAtIDQ4KSwgYyA9IEluQ2hhcigpOwogICAgcmV0dXJuIHggKiBwOwp9Cgpjb25zdGV4cHIgaW50IE1BWE4gPSAxZTUgKyAyLCBCTE9DS19TWiA9IDQwMDsKaW50IG4sIHE7CmludCBhW01BWE5dOwpsb25nIGxvbmcgaW52W21pbig2MDAsIE1BWE4gLyBCTE9DS19TWikgKyAxXVttaW4oNjAwLCBNQVhOIC8gQkxPQ0tfU1opICsgMV07CiAKdm9pZCBsb2FkX2lucHV0KHZvaWQpCnsKICAgIG4gPSBSZWFkSW50KCk7CiAgICBxID0gUmVhZEludCgpOwogICAgRk9SKGksIDEsIG4pIGFbaV0gPSBSZWFkSW50KCk7Cn0KCmludCBCSVRbTUFYTl07CnZvaWQgYWRkX3BvaW50KGludCBpZCwgaW50IHZhbCkKewogICAgZm9yICg7IGlkID4gMDsgaWQgLT0gaWQgJiAtaWQpIEJJVFtpZF0gKz0gdmFsOwp9CgppbnQgc3VtX3N1ZmZpeChpbnQgaWQpCnsKICAgIGludCByZXMgPSAwOwogICAgZm9yICg7IGlkID4gMCAmJiBpZCA8PSBuOyBpZCArPSBpZCAmIC1pZCkgcmVzICs9IEJJVFtpZF07CiAgICByZXR1cm4gcmVzOwp9CgppbnQgc3ViX2ludl9wcmVmW01BWE5dLCBzdWJfaW52X3N1ZmZbTUFYTl07CmludCBjbnRbbWluKDYwMCwgTUFYTiAvIEJMT0NLX1NaKSArIDFdW01BWE5dOwpwYWlyIDxpbnQsIGludD4gYmxrX3NvcnRlZFtNQVhOXTsKCnZvaWQgcHJlcGFyZSh2b2lkKQp7CiAgICBpbnQgbnVtX2Jsb2NrID0gbiAvIEJMT0NLX1NaOwogICAgRk9SKGksIDEsIG4pIGNudFtpIC8gQkxPQ0tfU1pdW2FbaV1dKys7CiAgICBSRVAoaWQsIG51bV9ibG9jayArIDEpCiAgICB7CiAgICAgICAgRk9SKHgsIDEsIG4pIGNudFtpZF1beF0gKz0gY250W2lkXVt4IC0gMV07CiAgICAgICAgaWYgKGlkKSBGT1IoeCwgMSwgbikgY250W2lkXVt4XSArPSBjbnRbaWQgLSAxXVt4XTsKCiAgICAgICAgaW50IHN0YXJ0ID0gbWF4KDEsIGlkICogQkxPQ0tfU1opLCBlbmQgPSBtaW4obiwgKGlkICsgMSkgKiBCTE9DS19TWiAtIDEpOwoKICAgICAgICBGT1IoaSwgc3RhcnQsIGVuZCkgYmxrX3NvcnRlZFtpXSA9IG1ha2VfcGFpcihhW2ldLCBpKTsKICAgICAgICBzb3J0KGJsa19zb3J0ZWQgKyBzdGFydCwgYmxrX3NvcnRlZCArIGVuZCArIDEpOwoKICAgICAgICBhZGRfcG9pbnQoYVtzdGFydF0sIDEpOwogICAgICAgIEZPUihpLCBzdGFydCArIDEsIGVuZCkKICAgICAgICB7CiAgICAgICAgICAgIHN1Yl9pbnZfcHJlZltpXSA9IHN1Yl9pbnZfcHJlZltpIC0gMV0gKyBzdW1fc3VmZml4KGFbaV0gKyAxKTsKICAgICAgICAgICAgYWRkX3BvaW50KGFbaV0sIDEpOwogICAgICAgIH0KICAgICAgICBGT1IoaSwgc3RhcnQsIGVuZCkgYWRkX3BvaW50KGFbaV0sIC0xKTsKCiAgICAgICAgYWRkX3BvaW50KGFbZW5kXSwgMSk7CiAgICAgICAgRk9SRChpLCBlbmQgLSAxLCBzdGFydCkKICAgICAgICB7CiAgICAgICAgICAgIHN1Yl9pbnZfc3VmZltpXSA9IHN1Yl9pbnZfc3VmZltpICsgMV0gKyBlbmQgLSBpIC0gc3VtX3N1ZmZpeChhW2ldKTsKICAgICAgICAgICAgYWRkX3BvaW50KGFbaV0sIDEpOwogICAgICAgIH0KICAgICAgICBGT1IoaSwgc3RhcnQsIGVuZCkgYWRkX3BvaW50KGFbaV0sIC0xKTsKICAgIH0KCiAgICBSRVAoaWQsIG51bV9ibG9jayArIDEpCiAgICB7CiAgICAgICAgbG9uZyBsb25nIGQgPSAwLCB0bXAgPSAwOwoKICAgICAgICBpbnQgc3RhcnQgPSBtYXgoMSwgaWQgKiBCTE9DS19TWik7CiAgICAgICAgaW50IGN1cl9pZCA9IGlkLCBzdGVwID0gaWQgPyAwIDogMTsKICAgICAgICBGT1IoaSwgc3RhcnQsIG4pCiAgICAgICAgewogICAgICAgICAgICArK3N0ZXA7CiAgICAgICAgICAgIGlmIChzdGVwID4gQkxPQ0tfU1opCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZXAgPSAxOwogICAgICAgICAgICAgICAgKytjdXJfaWQ7CiAgICAgICAgICAgICAgICB0bXAgKz0gc3ViX2ludl9wcmVmW2kgLSAxXTsKICAgICAgICAgICAgfQogCiAgICAgICAgICAgIGludCBwcmVfaWQgPSBjdXJfaWQgLSAxOwoKICAgICAgICAgICAgaWYgKGlkIDw9IHByZV9pZCkKICAgICAgICAgICAgICAgIGQgKz0gKGNudFtwcmVfaWRdW25dIC0gY250W3ByZV9pZF1bYVtpXV0pIC0gKGlkID8gKGNudFtpZCAtIDFdW25dIC0gY250W2lkIC0gMV1bYVtpXV0pIDogMCk7CgogICAgICAgICAgICBpbnZbaWRdW2N1cl9pZF0gPSBkICsgdG1wICsgc3ViX2ludl9wcmVmW2ldOwogICAgICAgIH0KICAgIH0KfQoKaW50IHNtYWxsX2FycltCTE9DS19TWiAqIDIgKyA1XTsKaW50IHNtYWxsX3RlbXBbQkxPQ0tfU1ogKiAyICsgNV07Cgpsb25nIGxvbmcgbWVyZ2Vfc29ydChpbnQgbCwgaW50IHIpIHsKICAgIGlmIChsID49IHIpIHJldHVybiAwOwogICAgaW50IG1pZCA9IGwgKyAociAtIGwpIC8gMjsKICAgIGxvbmcgbG9uZyByZXMgPSBtZXJnZV9zb3J0KGwsIG1pZCkgKyBtZXJnZV9zb3J0KG1pZCArIDEsIHIpOwogICAgaW50IGkgPSBsLCBqID0gbWlkICsgMSwgayA9IGw7CiAgICB3aGlsZSAoaSA8PSBtaWQgJiYgaiA8PSByKSB7CiAgICAgICAgaWYgKHNtYWxsX2FycltpXSA8PSBzbWFsbF9hcnJbal0pIHNtYWxsX3RlbXBbaysrXSA9IHNtYWxsX2FycltpKytdOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBzbWFsbF90ZW1wW2srK10gPSBzbWFsbF9hcnJbaisrXTsKICAgICAgICAgICAgcmVzICs9IChtaWQgLSBpICsgMSk7CiAgICAgICAgfQogICAgfQogICAgd2hpbGUgKGkgPD0gbWlkKSBzbWFsbF90ZW1wW2srK10gPSBzbWFsbF9hcnJbaSsrXTsKICAgIHdoaWxlIChqIDw9IHIpIHNtYWxsX3RlbXBbaysrXSA9IHNtYWxsX2FycltqKytdOwogICAgRk9SKHAsIGwsIHIpIHNtYWxsX2FycltwXSA9IHNtYWxsX3RlbXBbcF07CiAgICByZXR1cm4gcmVzOwp9CgppbnQgYXJyW0JMT0NLX1NaICsgMl07CmxvbmcgbG9uZyBjYWxjKGludCBsLCBpbnQgcikKewogICAgaW50IGlkX2wgPSBsIC8gQkxPQ0tfU1osIGlkX3IgPSByIC8gQkxPQ0tfU1o7CiAgICBpZiAoaWRfciAtIGlkX2wgPCAyKQogICAgewogICAgICAgIGludCBsZW4gPSByIC0gbCArIDE7CiAgICAgICAgRk9SKGksIDAsIGxlbiAtIDEpIHNtYWxsX2FycltpXSA9IGFbbCArIGldOwogICAgICAgIHJldHVybiBtZXJnZV9zb3J0KDAsIGxlbiAtIDEpOwogICAgfQoKICAgIGxvbmcgbG9uZyByZXMgPSBzdWJfaW52X3N1ZmZbbF0gKyBpbnZbaWRfbCArIDFdW2lkX3IgLSAxXSArIHN1Yl9pbnZfcHJlZltyXTsKICAgIGludCBzeiA9IDA7CiAgICBGT1IoaSwgbWF4KGwsIGlkX3IgKiBCTE9DS19TWiksIG1pbihuLCAoaWRfciArIDEpICogQkxPQ0tfU1ogLSAxKSkKICAgIHsKICAgICAgICBhdXRvIFt2YWwsIGlkeF0gPSBibGtfc29ydGVkW2ldOwogICAgICAgIGlmIChpZHggPiByKSBjb250aW51ZTsKCiAgICAgICAgYXJyWysrc3pdID0gdmFsOwogICAgICAgIHJlcyArPSAoY250W2lkX3IgLSAxXVtuXSAtIGNudFtpZF9yIC0gMV1bdmFsXSkgLSAoY250W2lkX2xdW25dIC0gY250W2lkX2xdW3ZhbF0pOwogICAgfQoKICAgIGludCBwdHIgPSAxOwogICAgRk9SKGksIG1heCgxLCBpZF9sICogQkxPQ0tfU1opLCBtaW4oKGlkX2wgKyAxKSAqIEJMT0NLX1NaIC0gMSwgcikpICAgIAogICAgewogICAgICAgIGF1dG8gW3ZhbCwgaWR4XSA9IGJsa19zb3J0ZWRbaV07CiAgICAgICAgaWYgKGlkeCA8IGwpIGNvbnRpbnVlOwoKICAgICAgICB3aGlsZSAocHRyIDw9IHN6ICYmIGFycltwdHJdIDwgdmFsKSArK3B0cjsKICAgICAgICByZXMgKz0gcHRyIC0gMTsKICAgICAgICByZXMgKz0gKGNudFtpZF9yIC0gMV1bdmFsIC0gMV0gLSBjbnRbaWRfbF1bdmFsIC0gMV0pOwogICAgfQoKICAgIHJldHVybiByZXM7Cn0KCnZvaWQgcHJvY2Vzcyh2b2lkKQp7CiAgICBwcmVwYXJlKCk7CgogICAgLy8gY291dCA8PCBjYWxjKDEsIDgpOyBleGl0KDApOwogICAgCiAgICBvc3RyaW5nc3RyZWFtIG9zczsKICAgIGxvbmcgbG9uZyBsYXN0ID0gMDsKICAgIHdoaWxlIChxLS0pCiAgICB7CiAgICAgICAgaW50IGwsIHI7IAogICAgICAgIGwgPSBSZWFkSW50KCk7CiAgICAgICAgciA9IFJlYWRJbnQoKTsKICAgICAgICBsID0gKGxhc3QgKyBsKSAlIG4gKyAxOwogICAgICAgIHIgPSAobGFzdCArIHIpICUgbiArIDE7CiAgICAgICAgaWYgKGwgPiByKSBzd2FwKGwsIHIpOwogICAgICAgIC8vIGNlcnIgPDwgbCA8PCAnICcgPDwgciA8PCAnXG4nOwoKICAgICAgICBvc3MgPDwgKGxhc3QgPSBjYWxjKGwsIHIpKSA8PCAnXG4nOwogICAgfQogICAgY291dCA8PCBvc3Muc3RyKCk7Cn0KCnNpZ25lZCBtYWluKHZvaWQpCnsgICAKICAgIGludCB0ZXN0Y2FzZSA9IDE7CiAgICB3aGlsZSAodGVzdGNhc2UtLSkKICAgIHsKICAgICAgICBsb2FkX2lucHV0KCk7CiAgICAgICAgcHJvY2VzcygpOwogICAgfQoKICAgIGNlcnIgPDwgIkRvbmUhIjsKICAgIHJldHVybiAwOwp9CgoKCg==