Pagini recente » Cod sursa (job #1441127) | Cod sursa (job #2800300) | Cod sursa (job #2458859) | Cod sursa (job #117681) | Cod sursa (job #2978218)
#include <bits/stdc++.h>
using namespace std;
struct Sqrt {
vector<int> v;
vector<pair<int, int>> blocks;
void Insert(int k, int x) {
int pos = split(k);
blocks.insert(blocks.begin() + pos, {v.size(), v.size()});
v.push_back(x);
balance();
}
int Access(int k) {
int ret = v[blocks[split(k)].first];
balance();
return ret;
}
void Reverse(int l, int r) {
int posl = split(l), posr = split(r);
for (int i = posl; i < posr; ++i)
swap(blocks[i].first, blocks[i].second);
reverse(blocks.begin() + posl, blocks.begin() + posr);
balance();
}
void Delete(int l, int r) {
int posl = split(l), posr = split(r);
blocks.erase(blocks.begin() + posl, blocks.begin() + posr);
balance();
}
int split(int k) {
for (int i = 0; i < (int)blocks.size(); ++i) {
if (k == 0) return i;
auto [l, r] = blocks[i];
int step = (l > r) ? -1 : 1;
int sz = abs(r - l) + 1;
if (k < sz) {
int mid = l + step * k;
blocks[i].first = mid;
blocks.insert(blocks.begin() + i, {l, mid - step});
return i + 1;
}
k -= sz;
}
return blocks.size();
}
void balance(bool force = false) {
if (force && blocks.size() < 300) return;
vector<int> nv;
for (auto [l, r] : blocks) {
int step = (l > r) ? -1 : 1;
for (int i = l; i != r + step; i += step)
nv.push_back(v[i]);
}
v = nv;
blocks = {{0, v.size() - 1}};
}
};
int main() {
ifstream cin("secv8.in");
ofstream cout("secv8.out");
int q, _; cin >> q >> _;
Sqrt S;
while (q--) {
char c; cin >> c;
if (c == 'I') {
int k, x; cin >> k >> x;
S.Insert(k - 1, x);
}
if (c == 'R') {
int l, r; cin >> l >> r;
S.Reverse(l - 1, r);
}
if (c == 'D') {
int l, r; cin >> l >> r;
S.Delete(l - 1, r);
}
if (c == 'A') {
int k; cin >> k;
cout << S.Access(k - 1) << '\n';
}
}
S.balance(true);
for (auto x : S.v)
cout << x << " ";
cout << endl;
return 0;
}