#include<bits/stdc++.h> usingnamespace std; #define ll long long constint N = 1e4 + 10; constint INF = 0x3f3f3f3f; int n, m; int a[N]; ll P[N]; int sum[N]; intlowbit(int x){ return x & -x; } voidadd(int p, int x){ for (int i = p; i <= n; i += lowbit(i)) sum[i] += x; } intquery(int r){ if (r == 0)return0; int ans = 0; for (int i = r; i > 0; i -= lowbit(i)) ans += sum[i]; return ans; } ll cal(){ ll ans = 1; for (int i = n; i >= 1; i--) { ans += P[i - 1] * query(a[n - i + 1] - 1); add(a[n - i + 1], -1); } return ans; } voidsol(ll x){ x--; for (int i = n; i >= 1; i--) { ll tmp = x / P[i - 1]; int L = 1, R = n; while (L < R) { int mid = (L + R) / 2; if (query(mid) - 1 >= tmp)R = mid; else L = mid + 1; } a[n - i + 1] = L; add(L, -1); x %= P[i - 1]; } } intmain(){ cin >> n >> m; P[0] = 1ll; for (int i = 1; i <= n; i++)P[i] = P[i - 1] * i; while (m--) { char op; scanf(" %c", &op); fill(sum, sum + n + 1, 0); for (int i = 1; i <= n; i++)add(i, 1); if (op == 'Q') { for (int i = 1; i <= n; i++)scanf("%d", &a[i]); printf("%lld\n", cal()); } else { ll x; scanf("%lld", &x); sol(x); for (int i = 1; i <= n; i++)printf("%d%s", a[i], i == n ? "\n" : " "); } } return0; }
#include<bits/stdc++.h> usingnamespace std; #define ll long long constint N = 2e5 + 10; constint INF = 0x3f3f3f3f; int n; int ta[N], tb[N], a[N], b[N], s[N], ans[N]; int sum[N]; intlowbit(int x){ return x & -x; } voidadd(int p, int x){ for (int i = p; i <= n; i += lowbit(i)) sum[i] += x; } intquery(int r){ int ans = 0; for (int i = r; i > 0; i -= lowbit(i)) ans += sum[i]; return ans; } voidpre(int* a, int* ans){ fill(sum + 1, sum + n + 1, 0); for (int i = 1; i <= n; i++)add(i, 1); for (int i = 1; i <= n; i++) { ans[i] = query(a[i] - 1); add(a[i], -1); } } voidsolve(){ fill(sum + 1, sum + n + 1, 0); for (int i = 1; i <= n; i++)add(i, 1); for (int i = 1; i <= n; i++) { int L = 1, R = n; while (L < R) { int mid = (L + R) / 2; if (query(mid) - 1 >= s[i])R = mid; else L = mid + 1; } ans[i] = L; add(L, -1); } } intmain(){ scanf("%d", &n); for (int i = 1; i <= n; i++)scanf("%d", &ta[i]), ta[i]++; for (int i = 1; i <= n; i++)scanf("%d", &tb[i]), tb[i]++; pre(ta, a); pre(tb, b); for (int i = n; i >= 1; i--) { s[i] = (a[i] + b[i]) % (n - i + 1); a[i - 1] += (a[i] + b[i]) / (n - i + 1); } solve(); for (int i = 1; i <= n; i++)printf("%d%s", ans[i] - 1, i == n ? "\n" : " "); return0; }