给定一个长为 (n) 的序列,有 (n) 次操作,每次可能在指定位置插入一个数,或者询问指定位置的数是多少,数据随机
Solution
考虑到数据随机,我们维护 (sqrt n) 个 vector
,每次操作的时候暴力扫一遍找到对应下标的位置即可
事实证明这样 T 了,我们该用 list
,于是就过了
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 200005;
int n, a[N], b[N], len, siz[N];
list<int> v[N];
#define li list<int>::iterator
li operator+(li a, int b) {
while (b--) a++;
return a;
}
signed main() {
ios::sync_with_stdio(false);
cin >> n;
len = ceil(sqrt(n));
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) b[i] = (i - 1) / len + 1;
for (int i = 1; i <= n; i++) v[b[i]].push_back(a[i]), siz[b[i]]++;
for (int _ = 1; _ <= n; _++) {
int opt, l, r, c;
cin >> opt >> l >> r >> c;
if (opt == 0) {
--l;
int p = 1;
while (l >= siz[p] && p <= n / len + 1) {
l -= siz[p++];
}
v[p].insert(v[p].begin() + l, r);
siz[p]++;
} else {
--r;
int p = 1;
while (r >= siz[p] && p <= n / len + 1) {
r -= siz[p++];
}
cout << *(v[p].begin() + r) << endl;
}
}
}