题解:AT_abc470_d [ABC470D] Inverse and Swap
:::success[引理:对于两个排列
这个比较显然,因为
:::
操作
然后看操作
于是就可以通过此题。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 5e5 + 10;
ll n, q;
void solve()
{
cin >> n >> q;
vector<ll> p(n + 1), pp(n + 1);
for (ll i = 1; i <= n; i++)
{
cin >> p[i];
pp[p[i]] = i;
}
while (q--)
{
ll op;
cin >> op;
if (op == 1)
{
ll x, y;
cin >> x >> y;
ll px = p[x], py = p[y];
swap(p[x], p[y]);
swap(pp[px], pp[py]);
}
else
{
swap(p, pp);
}
}
for (ll i = 1; i <= n; i++)
{
cout << p[i] << ' ';
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
ll t = 1;
// cin >> t;
while (t--)
{
solve();
}
return 0;
}