1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| #include<bits/stdc++.h> using namespace std; const int MAXtxtlen = 1e6; const int MAXsqrttxtlen = 1e3;
template <typename T> inline void read(T &a) { char c;for (c = getchar(); (c < '0' || c > '9') && c != '-'; c = getchar());bool f = c == '-';T x = f ? 0 : (c ^ '0');for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) {x = x * 10 + (c ^ '0');}a = f ? -x : x; } template <typename T, typename ...Argv> inline void read(T &a, Argv &...argv) { read(a), read(argv...); }
int n, sqrtn; struct Node { int len; Node *pre, *nex; char txt[MAXsqrttxtlen * 2 + 10]; Node() {len = 0, pre = nullptr, nex = nullptr, memset(txt, 0, sizeof(txt));} inline void split(int p) { Node *nw = new Node; nw->nex = nex; nex = nw; nw->pre = this; if (nw->nex != nullptr) nw->nex->pre = nw; copy(txt + p + 1, txt + len + 1, nw->txt + 1); nw->len = len - p; len = p; } inline void insert(int p, char ch) { for (int i = len; i > p; --i) { txt[i + 1] = txt[i]; } txt[p + 1] = ch; ++len; if (len > sqrtn) { split(len >> 1); } } }; Node *head; inline void Init(char *str) { Node *last = nullptr; for (int l = 1, r = sqrtn; ; l += sqrtn, r += sqrtn) { Node *nw = new Node; if (last != nullptr) { nw->pre = last; last->nex = nw; } else { head = nw; } nw->len = min(r, n) - l + 1; copy(str + l, str + l + nw->len, nw->txt + 1); last = nw; if (r >= n) break; } } inline char Query(int p) { --p; Node *cur = head; while (p >= cur->len) { p -= cur->len; cur = cur->nex; } return cur->txt[1 + p]; } inline void Insert(int p, char ch) { --p; Node *cur = head; if (p == -1) { cur->insert(0, ch); return; } while (p >= cur->len) { p -= cur->len; cur = cur->nex; } cur->insert(1 + p, ch); }
int m; char str[MAXtxtlen + 10]; signed main() { scanf("%s", str + 1); n = strlen(str + 1); sqrtn = sqrt(n); Init(str); read(m); char opt, ch; for (int i = 1, p; i <= m; ++i) { scanf("%s", &opt); if (opt == 'Q') { read(p); printf("%c\n", Query(p)); } else if (opt == 'I') { scanf("%s", &ch); read(p); Insert(p - 1, ch); } else { puts("Error!"); exit(1); } } return 0; }
|