rt.不知道为啥炸了/kk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e4 + 10;
const int MAXM = 1.5e2 + 10;
int c[MAXN];
inline
int lowbit(int k) {
return k & -k;
}
inline
void add(int k) {
for (int i = k; i <= 2e4; i += lowbit(i)) c[i]++;
}
inline
int query(int k) {
int res = 0;
for (int i = k; i; i -= lowbit(i)) res += c[i];
return res;
}
int a[MAXN], b[MAXN], len, tot, num;
int l[MAXM], r[MAXM], belong[MAXN];
vector<int> v[MAXM];
ll ans;
inline
void init(int n) {
memcpy(b, a, sizeof a), sort(b + 1, b + n + 1), num = unique(b + 1, b + n + 1) - b - 1;
for (int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + num + 1, a[i]) - b;
for (int i = n; i; i--) ans += query(a[i] - 1), add(a[i]);
len = sqrt(n), tot = (n - 1) / len + 1;
for (int i = 1; i <= tot; i++) l[i] = r[i - 1] + 1, r[i] = i * len;
for (int i = 1; i <= tot; i++) {
for (int j = l[i]; j <= r[i]; j++) belong[j] = i, v[i].push_back(a[j]);
sort(v[i].begin(), v[i].end());
}
}
inline
void change(int ql, int qr) {
if (belong[ql] != belong[qr]) {
v[belong[ql]].erase(lower_bound(v[belong[ql]].begin(), v[belong[ql]].end(), a[ql]));
v[belong[ql]].insert(upper_bound(v[belong[ql]].begin(), v[belong[ql]].end(), a[qr]), a[qr]);
v[belong[qr]].erase(lower_bound(v[belong[qr]].begin(), v[belong[qr]].end(), a[qr]));
v[belong[qr]].insert(upper_bound(v[belong[qr]].begin(), v[belong[qr]].end(), a[ql]), a[ql]);
}
swap(a[ql], a[qr]);
}
inline
ll query(int ql, int qr, int k) {
if (ql > qr) return 0;
int p = belong[ql], q = belong[qr], res = 0;
if (p == q) {
for (int i = ql; i <= qr; i++) res += (a[i] < k);
return res;
}
for (int i = ql; i <= r[p]; i++) res += (a[i] < k);
for (int i = p + 1; i <= q - 1; i++) res += lower_bound(v[i].begin(), v[i].end(), k) - v[i].begin();
for (int i = l[q]; i <= qr; i++) res += (a[i] < k);
return res;
}
int n, q, ql, qr;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]); init(n);
printf("%lld\n", ans);
for (scanf("%d", &q); q--;) {
scanf("%d%d", &ql, &qr);
if (ql > qr) swap(ql, qr);
if (a[ql] == a[qr]) { printf("%lld\n", ans); continue; }
ans += query(ql + 1, qr - 1, a[qr]) - query(ql + 1, qr - 1, a[ql]) << 1;
a[ql] < a[qr] ? ans++ : ans--, change(ql, qr);
printf("%lld\n", ans);
}
}