#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
typedef long long ll;
#define maxn 200010
using namespace std;
int c[maxn];
int lowbit(int x)
{
return x&(-x);
}
void add(int x) //更新数据,标准的updata在下面,在(x,y,z)处的值加1,所以k的值均为1
{
for(int i=x; i<maxn ; i+=lowbit(i))
{
c[i]+=1;
}
}
//void updata(int i,int k) //k的值为1
//{
// while(i<=maxn)
// {
// c[i]+=k;
// i+=lowbit(i);
// }
//}
int getsum(int x)
{
int ans=0;
while(x>0)
{
ans+=c[x];
x-=lowbit(x);
}
// for(int i=x;i>0;i-=lowbit(i))
// ans += c[i];
return ans;
}
int main()
{
int k;
int cnt=0; //用cnt记录op=1一共进行了几次,如果最后op=1的次数小于要求的能量值总和(k),则直接输出-1
double x,y,z;
int n;
cin >> n;
while(n--)
{
int op;
cin >> op;
if(op==1)
{
cin >> x >> y >> z;
cnt++;
double a = sqrt(x*x+y*y+z*z);
int aa = ceil(a); //向上取整
add(aa); //在距离原点距离为aa处,加一点能量值
}
else if(op==2)
{
cin >> k;
if(k>cnt)
{
printf("-1\n");
continue;
}
//二分查找 -》 树状数组一定是从小到大进行排序的。
int l=0,r=maxn,mid;
while(l<=r) //求的能量值,是从0~mid的能量值
{
mid = (l+r)/2;
if(getsum(mid)>=k) r=mid-1;
else l=mid+1;
}
printf("%d\n",l);
}
}
return 0;
}