B. Petr and Permutations | Codeforces Round #485 (Div. 1)
転倒数の偶奇は操作回数のそれと等しい。
とおく。 l番目の要素とr番目の要素を交換したとする。 l番目とr番目の間にz個の要素があるとする。 また、そのうち、もとのl番目より大きい要素をgL個, 小さい要素をlL(=z-gL)個とする。 まずl番目と間z個の関係だけで転倒数の増減を見ると gL - lL = gL - (z-gL) = 2gL-z だけ転倒数が増減する。 同様にr番目より大きい要素をgR個, 小さい要素をlR(=z-gR)個とすると、r番目と間の要素で lR - gR = (z-gR)-gR = z-2gR だけ増減する。 更に、l番目とr番目の関係だけ見ると転倒数が+-1だけ増減するので全体で (2gL-z)+(z-2gR)+-1=2(gL-gR)+-1 だけ転倒数が増減することがわかる。よって、1回の操作での転倒数の増減は常に奇数
long long inversionNumber(const vector<int> &a) { long long res = 0; int n = (int)a.size(); BinaryIndexedTree<long long> bit(n + 1); for (int x : a) { res += bit.sum(x + 1, n + 1); bit.add(x, 1); } return res; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout << fixed << setprecision(20); int N; cin >> N; vi A(N); each(a, A)cin >> a, --a; ll inv = inversionNumber(A); string re = "Um_nik"; if (3 * N % 2 == inv % 2)re = "Petr"; cout << re << endl; }