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

#include <stack>
#include <cstdio>

using namespace std;

long l[1<<16], r[1<<16];
stack<pair<short, long> > tree[1<<16];

void add(long x, long i, long j, short c, long w)
{
  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, i, j, c, w);
  if(j>(l[x]+r[x])/2)
    add(2*x+1, i, j, c, w);
}

long currW=-1;
short currC=-1;
void ask(long x, long i)
{
  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, i);
  else
    ask(x*2+1, i);
}

void rem(long x, long i, long j)
{
  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, i, j);
  if(j>(l[x]+r[x])/2)
    rem(2*x+1, i, j);
}

void initLR(void)
{
  long i;
  l[1]=0;
  r[1]=(1<<15)-1;
  for(i=2; i<(1<<16)-10; ++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)
{
  long N, M, i, j, w;
  short com, c;
  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);
      add(1, i, j, c, w);
    }
    if(com==2)
    {
      scanf("%ld %ld", &i, &j);
      rem(1, i, j);
    }
    if(com==3)
    {
      scanf("%ld", &i);
      currC=0;
      currW=-1;
      ask(1, i);
      printf("%hd\n", currC);
    }
  }
  return 0;
}

