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

#include <stack>
#include <cstdio>

using namespace std;

short com, c, currC;
long N, M, i, j, w, currW, l[1<<16], r[1<<16];
stack<pair<short, long> > tree[1<<16];

void add(long x)
{
  if(i>r[x] || j<l[x])
    return;
  if(i<=l[x]&&j>=r[x])
  {
    tree[x].push(make_pair(c, w));
    return;
  }
  if(i<=(l[x]+r[x])/2)
    add(2*x);
  if(j>(l[x]+r[x])/2)
    add(2*x+1);
}

void ask(long x)
{
  if(!tree[x].empty() && currW<tree[x].top().second)
  {
    currW=tree[x].top().second;
    currC=tree[x].top().first;
  }
  if(l[x]==r[x])
    return;
  if(i<=(l[x]+r[x])/2)
    ask(x*2);
  else
    ask(x*2+1);
}

void rem(long x)
{
  if(i>r[x] || j<l[x])
    return;
  if(i<=l[x]&&j>=r[x])
  {
    tree[x].pop();
    return;
  }
  if(i<=(l[x]+r[x])/2)
    rem(2*x);
  if(j>(l[x]+r[x])/2)
    rem(2*x+1);
}

void initLR(void)
{
  long i;
  l[1]=0;
  r[1]=(1<<15)-1;
  for(i=2; i<(1<<16); ++i)
  {
    if(!(i&1))
    {
      l[i]=l[i/2];
      r[i]=(l[i/2]+r[i/2])/2;
    }
    else
    {
      l[i]=(l[i/2]+r[i/2])/2+1;
      r[i]=r[i/2];
    }
  }
}

int main(void)
{
  initLR();
  scanf("%ld %ld", &N, &M);
  for(w=0; w<M; ++w)
  {
    scanf("%hd", &com);
    if(com==1)
    {
      scanf("%ld %ld %hd", &i, &j, &c);
      --j;
      add(1);
    }
    if(com==2)
    {
      scanf("%ld %ld", &i, &j);
      --j;
      rem(1);
    }
    if(com==3)
    {
      scanf("%ld", &i);
      currC=0;
      currW=-1;
      ask(1);
      printf("%hd\n", currC);
    }
  }
  return 0;
}

