//建立两个堆,一个大根堆,一个小根堆。从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;
}