/*
TASK: bands
LANG: C++
*/
#include <cstdio>
#include <vector>

#define MAXN 50000

using namespace std;

int n, m, treen = 1;
int tree[2*MAXN], left[2*MAXN], right[2*MAXN];
//int iter[2*MAXN];
//int step = 0;

vector<int> vec[2*MAXN];

void findC()
{ int mid, i;

  while(treen<n) treen*= 2;
  treen *= 2; mid = treen/2;
  for(i=treen-1; i>=mid; i--) {
                 left[i] = right[i] = i;
  }
  for(i=mid-1; i>=1; i--) {
               left[i] = left[2*i];
               right[i] = right[2*i+1];
  }
 return;
}

void add(int l, int r, int i, int col)
{
  //ako sme tuka
  if(l == left[i] && r == right[i]) {
       vec[i].push_back(tree[i]);
       tree[i] = col;
  //     iter[i] = step;
       return;
  }   //ako sme izcqlo vlevo
  else if(l >= left[2*i] && r <= right[2*i]) {
       add(l, r, 2*i, col);
  } //ako sme izcqlo vdqfxgsno
   else if(l >= left[2*i+1] && r <= right[2*i+1]) {
        add(l, r, 2*i+1, col);
   }
    else {
      add(l, right[2*i], 2*i, col);
      add(left[2*i+1], r, 2*i+1, col);
    }
    if(tree[2*i] != tree[2*i+1]) tree[i] = -1;
     else tree[i] = tree[2*i];
}

void del(int l, int r, int i)
{
  //ako sme tuka
  if(l == left[i] && r == right[i]) {
       tree[i] = vec[i].back();
    //   iter[i] = step;
       vec[i].pop_back();
       return;
  }   //ako sme izcqlo vlevo
  else if(l >= left[2*i] && r <= right[2*i]) {
       del(l, r, 2*i);
  } //ako sme izcqlo vdqsno
   else if(l >= left[2*i+1] && r <= right[2*i+1]) {
        del(l, r, 2*i+1);
   }
    else {
      del(l, right[2*i], 2*i);
      del(left[2*i+1], r, 2*i+1);
    }
    if(tree[2*i] != tree[2*i+1]) tree[i] = -1;
     else tree[i] = tree[2*i];
}

void check(int i)
{ int tmp;

  if(tree[i] == tree[i/2]) {
         tmp = tree[i];
         while(tree[i] == tmp && i>=1) i/=2;
         if(tree[i] == -1) printf("%d\n", tmp);
           else printf("%d\n", tree[i]);
             return;
  }
   else if(tree[i/2] != -1 && tree[i] != tree[i/2]) {
        printf("%d\n", tree[i/2]);
        return;        
   }
    else if(tree[i/2] == -1) {
         printf("%d\n", tree[i]);
         return;
    }

 return;
}

void solve()
{ int i, fr, to, code, color;

   scanf("%d %d", &n, &m);
   findC();
   //step = 1;
   for(i=0; i<m; i++) {
            scanf("%d", &code);
            if(code == 1) {
                    scanf("%d %d %d", &fr, &to, &color);
                    add(treen/2+fr, treen/2+to-1, 1,color);
            }
             else if(code == 2) {
                  scanf("%d %d", &fr, &to);
                  del(treen/2+fr, treen/2+to-1, 1);
             }
              else {
                   scanf("%d", &fr);
                   check(treen/2+fr);
              }
   // step++;
   }
 return;
}

int main()
{
//  freopen("temp.in", "rt", stdin);
//  freopen("temp.out", "wt", stdout);
  solve();
 return 0;
}

