#include <stdio.h>
#include <set>

const int N = 1e6 + 5;

struct node
{
    int l, r;
    std::set<int> st;
}
t[N * 4];

void build(int i, int l, int r)
{
    t[i].l = l, t[i].r = r;
    int mid = (l + r) >> 1;
    if (r - l != 1)
        build(i << 1, l, mid), build(i << 1 | 1, mid, r);
}

void add(int i, int l, int r, int k)
{
    if (r <= t[i].l || l >= t[i].r)
        return;
    if (l <= t[i].l && r >= t[i].r)
    {
        t[i].st.insert(k);
        return;
    }
    add(i << 1, l, r, k);
    add(i << 1 | 1, l, r, k);
}

void del(int i, int l, int r, int k)
{
    if (r <= t[i].l || l >= t[i].r)
        return;
    if (l <= t[i].l && r >= t[i].r)
    {
        auto it = t[i].st.find(k);
        if (it != st.end())
            t[i].st.erase(it);
        return;
    }
    del(i << 1, l, r, k);
    del(i << 1 | 1, l, r, k);
}

int query(int i, int x)
{
    if (x < t[i].l || x >= t[i].r)
        return INT_MIN;
    if (t[i].r - t[i].l == 1)
        return *t[i].st.begin();

    int mid = (t[i].l + t[i].r) / 2;
    if (x < mid)
        return std::min(*t[i].st.begin(), query(i << 1, x));
    else
        return std::min(*t[i].st.begin(), query(i << 1 | 1, x));
}

int main()
{
    int n, k, q; scanf("%d %d %d", &n, &k, &q);
    build(1, 1, 1e6 + 1);
    for (int i = 0; i < k; i++)
    {
        int x; scanf("%d", &x);
        add(1, 1, N + 1, x);
    }

    while (q--)
    {
        int t, op; scanf("%d %d", &t, &op);
        if (op == 1)
        {
            int i; scanf("%d", &i);
            add(1, t, 1e6 + 1, i);
        }
        if (op == 2)
        {
            int i; scanf("%d", &i);
            del(1, t, 1e6 + 1, i);
        }
        if (op == 3)
        {
            printf("%d\n", query(1, t));
        }
    }
    return 0;
}
