//建立两个堆,一个大根堆,一个小根堆。从K处劈开
#include <bits/stdc++.h>


using namespace std;
int n, m, k;
const int maxn = 2e5+10;
int a[maxn];


int main() {
    priority_queue<int, vector<int>, less<int> >z;
    priority_queue<int, vector<int>, greater<int> >y;
    int val;
    cin>>n>>m>>k;
    //建立左右根堆
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    sort(a+1, a+n+1);
    for (int i=1;i<=n;i++) {
        if (i<=k) {
//             cout<<i<<endl;
            z.push(a[i]);
        } else {
            y.push(a[i]);
        }
    }
    int op;
//     cout<<z.top()<<endl;
    //开始操作
    while (m--) {
        cin>>op;
        if (op==1) {
            cin>>val;
            if (z.size()<k) z.push(val);
            else if (val>=z.top()) {
                y.push(val);
            } else {
                y.push(z.top());
                z.pop();
                z.push(val);
            }
        }
        if (op==2) {
            if (z.size()<k) {
                cout<<-1<<endl;
            } else
            cout<<z.top()<<endl;
        }
    }
    
    return 0;
}