給定序列A[N],元素值各不相同,有Q個操作,格式如下:
- 1 x y: 在元素x後面插入元素y,保證插入時x唯一。
- 2 x: 將元素x從序列中刪除,保證刪除時x唯一。
輸出所有操作完成後的序列。
1<=N,Q<=2E5; 1<=A[i]<=1E9; A[i]!=A[j]
用連結串列來快速插入和刪除,另外還需要map來快速定位,類似LRU的實現。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)
const int Z = 200005;
int N, Q;
list<int> lst;
map<int,list<int>::iterator> mp;
void solve() {
cin >> N;
rep(i,1,N) {
int a;
cin >> a;
lst.push_back(a);
mp[a] = --lst.end();
}
cin >> Q;
while (Q--) {
int op, x, y;
cin >> op;
if (op == 1) {
cin >> x >> y;
auto it = mp.find(x)->second;
mp[y] = lst.insert(++it, y);
} else if (op == 2) {
cin >> x;
auto it = mp.find(x)->second;
lst.erase(it);
mp.erase(x);
}
}
for (auto i : lst) cout << i << " ";
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}