/*
TASK:bands
LANG:C++
*/

#include <cstdio>
//#include <conio.h>
#include <algorithm>
#include <vector>
using namespace std;

#define MT      (1<<15)

int N,M;

typedef pair<short,int> pii;
vector<pii> vt[2*MT];
int L,R,C,T;
pii best;

inline void update(int i, int l,int r, int oper)
{
    if (L<=l && r<=R) {
        if (oper==1) {
            vt[i].push_back( pii(C,T) );
        }
        else {
            vt[i].pop_back();
        }
        return;
    }
    
    int mid=(l+r)/2;
    if (L<=mid) update(2*i, l,mid, oper);
    if (mid<R) update(2*i+1, mid+1,r, oper);
}

inline void query(int i, int l,int r)
{
    if (l<=L && R<=r) {
        if (0!=vt[i].size()) {
            //printf("ok\n");
            if (best.second < vt[i][ vt[i].size()-1 ].second) {
                best = vt[i][ vt[i].size()-1 ];
            }
        }
    }
    if (L<=l && r<=R) return;
    
    int mid=(l+r)/2;
    if (L<=mid) query(2*i, l,mid);
    if (mid<R) query(2*i+1, mid+1,r);
}

int main()
{
    //freopen("a2.in","r",stdin);
    
    scanf("%d%d",&N,&M);
    int x;
    T=1;
    
    for (int i=0;i<M;++i) {
        scanf("%d",&x);
        if (x==1) {
            scanf("%d%d%d",&L,&R,&C); R--;
            update(1, 0,MT-1, 1);
            T++;
        }
        if (x==2) {
            scanf("%d%d",&L,&R); R--;
            update(1, 0,MT-1, 0);
        }
        if (x==3) {
            scanf("%d",&L);
            R=L;
            
            best=pii(0,0);
            query(1, 0, MT-1);
            printf("%d\n",best.first);
        }
    }
    
    //getch();
    return 0;
}
