#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n , T , tt , x[N] , c[N] , pos[N] , L[N] , R[N];
inline void build_tree (int o)
{
for (register int i = L[o]; i <= R[o]; i++)
c[i] = x[i];
sort (c + L[o] , c + R[o] + 1);
}
inline void modfy (int u , int v)
{
x[u] = v;
build_tree (pos[u]);
}
inline int check (int y , int val)
{
int l = L[y] , r = R[y] , mid , ans = -1;
while (l <= r)
{
mid = l + r >> 1;
if (c[mid] <= val)
ans = mid , l = mid + 1;
else r = mid - 1;
}
return (~ans) ? ans - L[y] + 1 : 0;
}
inline int ask (int l , int r , int k)
{
int ll = 0 , rr = 1e9 , mid , ans = 1 , p = pos[l] , q = pos[r] , cnt = 0;
while (ll <= rr)
{
mid = ll + rr >> 1 , cnt = 0;
if (p == q)
for (register int i = l; i <= r; i++)
if (x[i] <= mid) ++cnt;
else
{
for (register int i = l; i <= R[p]; i++)
if (x[i] <= mid) ++cnt;
for (register int i = L[q]; i <= r; i++)
if (x[i] <= mid) ++cnt;
for (register int i = p + 1; i <= q - 1; i++)
cnt += check (i , mid);
}
if (cnt >= k)
ans = mid , rr = mid - 1;
else ll = mid + 1;
}
return ans;
}
signed main ()
{
cin >> n >> T;
for (register int i = 1; i <= n; i++) cin >> x[i];
tt = sqrt (n);
for (register int i = 1; i <= tt; i++)
L[i] = R[i - 1] + 1 , R[i] = i * tt;
if (R[tt] < n) tt++ , L[tt] = R[tt - 1] + 1 , R[tt] = n;
for (register int i = 1; i <= tt; i++)
{
for (register int j = L[i]; j <= R[i]; j++)
pos[j] = i;
build_tree (i);
}
while (T--)
{
int l , r , k;
char opt;
cin >> opt;
if (opt == 'C')
{
cin >> l >> r;
modfy (l , r);
}
else
{
cin >> l >> r >> k;
cout << ask (l , r , k) << "\n";
}
}
return 0;
}