#include<cstdio>
#include<algorithm>
#define MN 1400010
#define M 2000
using namespace std;
int n,m,X,ro[MN],L[MN],R[MN],x,y,num=0,nm=0,x1,x2,y1,y2,root=0,xx,o,MMH=0,mmh[MN],st[MN],l,r;
struct tr{
int x,y;
friend bool operator<(tr a,tr b){
if (X) return a.x<b.x;else return a.y<b.y;
}
}a[MN],A[MN];
struct tree{
int xa,xi,ya,yi,l,r,si;
}t[MN],T[MN];
char cs;
inline int read(){
cs=getchar();xx=0;
while(cs<‘0‘||cs>‘9‘) cs=getchar();
while(cs>=‘0‘&&cs<=‘9‘) xx=xx*10+cs-48,cs=getchar();
return xx;
}
inline void in(int &p,bool b){
if (!p){
p=num;
t[p].l=t[p].r=0;
t[p].xa=t[p].xi=a[num].x;
t[p].ya=t[p].yi=a[num].y;
t[p].si=1;
return;
}
X=b;t[p].si++;
if (a[num]<a[p]) in(t[p].l,b^1);else in(t[p].r,b^1);
t[p].xa=max(t[p].xa,a[num].x);
t[p].xi=min(t[p].xi,a[num].x);
t[p].ya=max(t[p].ya,a[num].y);
t[p].yi=min(t[p].yi,a[num].y);
}
inline int build(int l,int r,int now){
X=now;
int mid=(l+r)>>1;
nth_element(A+l,A+mid,A+r+1);
T[mid].si=r-l+1;
T[mid].xa=T[mid].xi=A[mid].x;
T[mid].ya=T[mid].yi=A[mid].y;
if (l<mid) T[mid].l=build(l,mid-1,now^1),
T[mid].xa=max(T[T[mid].l].xa,T[mid].xa),
T[mid].xi=min(T[T[mid].l].xi,T[mid].xi),
T[mid].ya=max(T[T[mid].l].ya,T[mid].ya),
T[mid].yi=min(T[T[mid].l].yi,T[mid].yi);else T[mid].l=0;
if (mid<r) T[mid].r=build(mid+1,r,now^1),
T[mid].xa=max(T[T[mid].r].xa,T[mid].xa),
T[mid].xi=min(T[T[mid].r].xi,T[mid].xi),
T[mid].ya=max(T[T[mid].r].ya,T[mid].ya),
T[mid].yi=min(T[T[mid].r].yi,T[mid].yi);else T[mid].r=0;
return mid;
}
inline int wout(int p){
st[l=r=1]=p;
while(l<=r){
A[l]=a[st[l]];
if (t[st[l]].l) st[++r]=t[st[l]].l;
if (t[st[l]].r) st[++r]=t[st[l]].r;
l++;
}
l=build(1,r,0);
for (register int i=1;i<=r;i++) t[st[i]]=T[i],a[st[i]]=A[i],t[st[i]].l=st[t[st[i]].l],t[st[i]].r=st[t[st[i]].r];
return st[l];
return p;
}
inline void insert(int &p,int l,int r,int v,bool b){
if (!p) p=++nm,mmh[p]=M;
if (b){
a[++num].x=x;a[num].y=y;in(ro[p],0);
if (t[ro[p]].si==mmh[p]) mmh[p]+=M,ro[p]=wout(ro[p]);
}
if (l==r) return;
int mid=l+r>>1;
if (v<=mid) insert(L[p],l,mid,v,0);else insert(R[p],mid+1,r,v,1);
}
inline int ask(int p){
if (t[p].xa<=x2&&t[p].xi>=x1&&t[p].ya<=y2&&t[p].yi>=y1) return 1;
if (t[p].xi>x2||t[p].xa<x1||t[p].yi>y2||t[p].ya<y1) return 0;
return 2;
}
inline bool inl(int p){
if (a[p].x>=x1&&a[p].x<=x2&&a[p].y>=y1&&a[p].y<=y2) return 1;
return 0;
}
inline int QUE(int p){
int mmh=ask(p);
if (!mmh) return 0;
if (mmh==1) return t[p].si;else{
if (inl(p)) mmh=1;else mmh=0;
if (t[p].l) mmh+=QUE(t[p].l);
if (t[p].r) mmh+=QUE(t[p].r);
}
return mmh;
}
inline int que(int p,int l,int r,int k){
if (l==r) return l;
int u=0;if (R[p]) u=QUE(ro[R[p]]);
int mid=l+r>>1;
if (u<k) return que(L[p],l,mid,k-u);else return que(R[p],mid+1,r,k);
}
int main(){
register int i,k;
n=read();m=read();
for (i=1;i<=m;i++){
o=read();
if (o==1) x=MMH^read(),y=MMH^read(),insert(root,1,1e9,MMH^read(),1);else{
x1=MMH^read();y1=MMH^read();x2=MMH^read();y2=MMH^read();k=MMH^read();
if (QUE(ro[root])<k) printf("NAIVE!ORZzyz.\n",MMH=0);else
printf("%d\n",MMH=que(root,1,1e9,k));
}
}
}