/*
TASK:bands
LANG:C++
*/
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#define PB push_back
#define MP make_pair
#define X first
#define Y second

using namespace std;

int n,m;

struct yey{ int s,e,c; };

inline bool operator<(yey a,yey b)
{
     if (a.s!=b.s) return a.s<b.s;
     if (a.e!=b.e) return a.e<b.e;
     return a.c<b.c;
}

vector<set<yey> > a;
set<yey> tmp;

inline yey MY(int s,int e,int c)
{
    yey aa;
    aa.e=e; aa.s=s; aa.c=c;
    return aa;
}

inline void push(int lev,yey x)
{
     int i,j,k,l;
     vector<yey> ans;
     set<yey>::iterator it,i1;
     if (lev>=a.size()) a.PB(tmp);
     a[lev].insert(x);
     
     it=a[lev].find(x); i1=it; it--;
     while (i1!=a[lev].begin() && it->e>=x.s) { ans.PB(*it); it--; i1--; }
     j=ans.size()-1;
     it=a[lev].find(x); it++;
     while (it!=a[lev].end() && it->s<=x.e) { ans.PB(*it); it++; }
     for (i=0; i<ans.size(); i++) a[lev].erase(ans[i]);
     
     if (ans.size()>0)
     {
      if (ans[j].s<x.s) { a[lev].insert(MY(ans[j].s,x.s-1,ans[j].c)); ans[j].s=x.s; }
      if (ans[ans.size()-1].e>x.e) { a[lev].insert(MY(x.e+1,ans[ans.size()-1].e,ans[ans.size()-1].c)); ans[ans.size()-1].e=x.e; }
     }
     for (i=0; i<ans.size(); i++)
      push(lev+1,ans[i]);
}

inline void pop(int lev,int s,int e)
{
     int i,j,k,l;
     vector<yey> ans;
     set<yey>::iterator it,i1;
     
     yey tt=MY(s,e,0);
     if (lev==0)
     {
        a[0].insert(tt);
        it=a[0].find(tt);
        it++;
        if (it!=a[0].end() && it->s==s && it->e==e)
         {
                           a[0].erase(it);
                           a[0].erase(tt);
                           pop(lev+1,s,e); 
         }
        else a[0].erase(tt); 
     }
     else if (lev<a.size())
     {
       a[lev].insert(tt);
       it=a[lev].find(tt); i1=it; it--;
       while (i1!=a[lev].begin() && it->e>=s) { ans.PB(*it); it--; i1--; }
       j=ans.size()-1;
       it=a[lev].find(tt); it++;
       while (it!=a[lev].end() && it->s<=e) { ans.PB(*it); it++; }
       for (i=0; i<ans.size(); i++) a[lev].erase(ans[i]);
     
       if (ans.size()>0)
       {
         if (j>-1 && ans[j].s<s) 
          { a[lev].insert(MY(ans[j].s,s-1,ans[j].c)); ans[j].s=s; }
         if (ans[ans.size()-1].e>e) 
          { a[lev].insert(MY(e+1,ans[ans.size()-1].e,ans[ans.size()-1].c)); ans[ans.size()-1].e=e; }
       }
       
       
       for (i=0; i<ans.size(); i++)
        a[lev-1].insert(ans[i]);
       if (ans.size()>0) 
       {
         if (j>-1) 
         {
            it=a[lev-1].find(ans[j]); 
            if (it!=a[lev-1].begin())
             { 
                                     it--;
                                     if (it->c==ans[j].c && it->e==ans[j].s-1)
                                      {
                                                         tt=ans[j];
                                                         tt.s=it->s;
                                                         a[lev-1].erase(it);
                                                         a[lev-1].erase(ans[j]);
                                                         a[lev-1].insert(tt);
                                      }
             }                        
         }

         it=a[lev-1].find(ans[ans.size()-1]); it++;
         if (it!=a[lev-1].end() && it->c==ans[ans.size()-1].c && it->s==ans[ans.size()-1].e+1)
          {
                                                         tt=ans[ans.size()-1];
                                                         tt.e=it->e;
                                                         a[lev-1].erase(it);
                                                         a[lev-1].erase(ans[ans.size()-1]);
                                                         a[lev-1].insert(tt);
           }
       }
       a[lev].erase(MY(s,e,0));
       pop(lev+1,s,e);
     }
}
 
int main()
{
    int i,j,k,l,s,e,c;
//    ifstream f("bands.in1");
    set<yey>::iterator it,i1;
    vector<yey> x;
//    f>>n>>m;
    scanf("%d %d",&n,&m);
    for (i=0; i<m; i++)
    {
        scanf("%d",&j);
        if (j==1) 
         {  //f>>s>>e>>c;
            scanf("%d %d %d",&s,&e,&c);
            push(0,MY(s,e-1,c));
         }
        if (j==3)
         {
                //f>>k;
                scanf("%d",&k);
                c=0;
                a[0].insert(MY(k,k,0));
                it=a[0].find(MY(k,k,0));
                if (it!=a[0].begin())
                 { i1=it; i1--; if (i1->s<=k && i1->e>=k) c=i1->c; }
                i1=it; i1++;
                if (i1!=a[0].end()) if (i1->s<=k && i1->e>=k) c=i1->c;
//                cout<<c<<endl;
                printf("%d\n",c);
         } 
        if (j==2)
        {
              //   f>>k>>l;
                 scanf("%d %d",&k,&l);
                 pop(0,k,l-1);
                 for (k=0; k<a.size(); k++)
                  if (a[k].empty()) { a.erase(a.begin()+k,a.begin()+k+1); k--; }
        } 


/*            for (k=0; k<a.size(); k++)
             {  for (it=a[k].begin(); it!=a[k].end(); it++)
                 cout<<"("<<it->s<<","<<it->e<<","<<(int)it->c<<") ; ";
                 cout<<endl; 
             }
            cout<<endl; */

    }
//    f.close();
    
    return 0;
}
