#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 1e5 + 5;
struct Query {
int x, y, k, op, id;
} q[N << 1], ql[N << 1], qr[N << 1];
struct node {
int val, id;
} p[N << 1];
inline bool cmp(node a, node b) {
return a.val < b.val;
}
int ans[N], n, m, a[N], v[N], t[N << 1];
char u[4];
inline int read() {
int x = 0, f = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48);
return x * f;
}
inline int lb(int x) {
return x & (-x);
}
inline void add(int x, int y) {
for (; x <= n; x += lb(x)) t[x] += y;
}
inline int sum(int x) {
int res = 0;
for (; x; x -= lb(x)) res += t[x];
return res;
}
void slove(int l, int r, int L, int R) {
if (l > r || L > R) return;
int cl = 0, cr = 0, m = (l + r) >> 1;
if (l == r) {
for (int i = L; i <= R; i++)
if (q[i].op == 1) ans[q[i].id] = v[l];
return;
}
for (int i = L; i <= R; i++)
if (q[i].op == 1) {
int t = sum(q[i].y) - sum(q[i].x - 1);
if (q[i].k <= t) ql[++cl] = q[i];
else q[i].k -= t, qr[++cr] = q[i];
} else {
if (q[i].y <= m) add(q[i].x, q[i].k), ql[++cl] = q[i];
else qr[++cr] = q[i];
}
for (int i = 1; i <= cl; i++) if (ql[i].op == 0) add(ql[i].x, -ql[i].k);
for (int i = 1; i <= cl; i++) q[L + i - 1] = ql[i];
for (int i = 1; i <= cr; i++) q[L + i + cl + -1] = qr[i];
slove(l, m, L, L + cl - 1), slove(m + 1, r, L + cl, R);
}
int main() {
ios::sync_with_stdio(0), cout.tie(0);
n = read(), m = read();
for (int i = 1; i <= n; i++) p[i] = (node) {
read(), i
};
sort(p + 1, p + n + 1, cmp);
for (int i = 1; i <= n; i++) a[p[i].id] = i, v[i] = p[i].val;
for (int i = 1; i <= m; i++) {
scanf("%s", u);
if (u[0] == 'Q') q[i].x = read(), q[i].y = read(), q[i].k = read(),
q[i].id = i, q[i].op = 1;
else q[i].x = read(), q[i].y = read(), q[i].k = 0,
q[i].id = i, q[i].op = 0;
}
slove(1, N << 1, 1, m);
for (int i = 1; i <= m; i++)
if (q[i].op == 1) cout << ans[i] << endl;
return 0;
}