#include #include #include #include #include using namespace std; int n, i, j, q, a[200000 + 5], bn, fwt[200000 + 5], ans[200000 + 5], m, l, r, b[200000 + 5], mu, idx; vector > prefix[200000 + 5], suffix[200000 + 5]; long long add = 0; void solve_prefix () { for(i = 1; i <= n; i++) { for(j = a[i]; j > 0; j = (j & (j - 1))) ++fwt[j]; for(q = 0; q < prefix[i].size(); q++) { mu = (prefix[i][q].second / abs(prefix[i][q].second)); idx = abs(prefix[i][q].second); if (mu == 1) for(j = prefix[i][q].first; j <= bn; j = (j | (j - 1)) + 1) ans[idx] += fwt[j]; if (mu == -1) for(j = prefix[i][q].first; j <= bn; j = (j | (j - 1)) + 1) ans[idx] -= fwt[j]; } } } void solve_suffix () { for(i = 0; i <= bn; i++) fwt[i] = 0; for(i = n; i > 0; i--) { for(j = a[i]; j <= bn; j = (j | (j - 1)) + 1) ++fwt[j]; for(q = 0; q < suffix[i].size(); q++) { mu = (suffix[i][q].second / abs(suffix[i][q].second)); idx = abs(suffix[i][q].second); if (mu == 1) for(j = suffix[i][q].first; j > 0; j = (j & (j - 1))) ans[idx] += fwt[j]; if (mu == -1) for(j = suffix[i][q].first; j > 0; j = (j & (j - 1))) ans[idx] -= fwt[j]; } } } int read () { int fl = 0, ret = 0, ch; while (true) { ch = getchar(); if (ch < 48) if (fl) return ret; else continue; ret = 10 * ret + ch - 48; fl = 1; } } int main (int argc, char * const argv[]) { // freopen("input.txt", "r", stdin); scanf("%d %d", &n, &m); assert(1 <= n && n <= 200000); for(i = 1; i <= n; i++) { a[i] = read(); assert(1 <= a[i] && a[i] <= 1000000000); b[i] = a[i]; } sort(b + 1, b + n + 1); bn = unique(b + 1, b + n + 1) - (b + 1); for(i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + bn + 1, a[i]) - b; for(i = 1; i <= m; i++) { l = read(); r = read(); assert(1 <= l && l <= n); assert(1 <= r && r <= n); if (l > r) swap(l, r); if (a[l] > a[r]) ++ans[i]; else if (a[l] < a[r]) ++ans[i]; prefix[l - 1].push_back(make_pair(a[l] + 1, -i)); suffix[l + 1].push_back(make_pair(a[l] - 1, -i)); prefix[r - 1].push_back(make_pair(a[r] + 1, -i)); suffix[r + 1].push_back(make_pair(a[r] - 1, -i)); prefix[l - 1].push_back(make_pair(a[r] + 1, +i)); suffix[l + 1].push_back(make_pair(a[r] - 1, +i)); prefix[r - 1].push_back(make_pair(a[l] + 1, +i)); suffix[r + 1].push_back(make_pair(a[l] - 1, +i)); } for(i = 1; i <= n; i++) { add += i - 1; for(j = a[i]; j > 0; j = (j & (j - 1))) add -= fwt[j]; for(j = a[i]; j <= bn; j = (j | (j - 1)) + 1) ++fwt[j]; } // cerr << add << endl; for(i = 0; i <= bn; i++) fwt[i] = 0; solve_prefix(); solve_suffix(); for(i = 1; i <= m; i++) printf("%lld\n", add + ans[i]); return 0; }