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

#include <cstdio>
#include <stack>

using namespace std;

#define MAX    20005

#define MAX_Z 100005

#define MAX_T (1 << 16)

typedef struct { int leaf, col; } node;

typedef struct { int id, a, b, col; } item;

void input(void);
void solve(void);

void solve1(void);

void init_T(void);
void put_it(int t, int a, int b, int x, int y, int z);
int  get_it(int t, int a, int b, int x);

void init_A(void);
void put_it1(int a, int b, int z);
int  get_it1(int a);
void remove_it1(int a, int b);

int n, m;
item Z[MAX_Z];

int flag;

stack<int> A[MAX];

node T[MAX_T];

int main(void)
{
    input();
    solve();
    
    return 0;
}

void input(void)
{
     int id, a, b, col;
     int i;
     
     scanf("%d %d", &n, &m);
     
     flag = 0;
     for(i = 0; i < m; i++) {
       scanf("%d", &id);
       if(id == 1) { 
         scanf("%d %d %d", &a, &b, &col);
         Z[i].id = 1;
         Z[i].a = a; 
         Z[i].b = b;
         Z[i].col = col;
       }
       if(id == 2) {
         flag = 1;
         scanf("%d %d", &a, &b);
         Z[i].id = 2;
         Z[i].a = a;
         Z[i].b = b;
       }
       if(id == 3) {
         scanf("%d", &a);
         Z[i].id = 3;
         Z[i].a = a;
       }
     }
}

void solve(void)
{
     int id, a, b, col;
     int i;
     
     if(flag) { solve1(); return; }
     
     init_T(); 
     
     for(i = 0; i < m; i++) {
       id = Z[i].id;
       if(id == 1) { 
         /*scanf("%d %d %d", &a, &b, &col);*/
         a = Z[i].a;
         b = Z[i].b;
         col = Z[i].col;
         put_it(1, 0, n, a, b - 1, col);
       }
       if(id == 3) {
         /*scanf("%d", &a);*/
         a = Z[i].a;
         printf("%d\n", get_it(1, 0, n, a));
       }
     }
}

void init_T(void)
{
     int i;
     
     for(i = 0; i < MAX_T; i++) {
           T[i].leaf = 0;
           T[i].col  = 0;
     }
     T[1].leaf = 1;
}

void put_it(int t, int a, int b, int x, int y, int z)
{
     int mid = (a + b) / 2;
     
     if(a == x && b - 1 == y) { 
       T[t].col  = z; 
       T[t].leaf = 1;
       return;
     }
     
     if(T[t].leaf == 1) { 
       put_it(2 * t, a, mid, a, mid - 1, T[t].col);
       put_it(2 * t + 1, mid, b, mid, b - 1, T[t].col);
     }
     
     T[t].leaf = 0;
     
     if(y < mid) put_it(2 * t, a, mid, x, y, z);
     else if(x >= mid) put_it(2 * t + 1, mid, b, x, y, z);
     else {
       put_it(2 * t, a, mid, x, mid - 1, z);
       put_it(2 * t + 1, mid, b, mid, y, z);
     }
}

int get_it(int t, int a, int b, int x)
{
    int mid = (a + b) / 2; 
    
    if(T[t].leaf) return T[t].col;
    
    if(x < mid) return get_it(2 * t, a, mid, x);
    else        return get_it(2 * t + 1, mid, b, x);
}

void solve1(void)
{
     int id, a, b, col;
     int i;
     
     init_A();
     
     for(i = 0; i < m; i++) {
       id = Z[i].id;
       if(id == 1) { 
         /*scanf("%d %d %d", &a, &b, &col);*/
         a = Z[i].a;
         b = Z[i].b;
         col = Z[i].col;
         put_it1(a, b, col);
       }
       if(id == 2) {
         a = Z[i].a;
         b = Z[i].b;
         remove_it1(a, b);
       }
       if(id == 3) {
         /*scanf("%d", &a);*/
         a = Z[i].a;
         printf("%d\n", get_it1(a));
       }
     }
}

void init_A(void)
{
     int i;
  
     for(i = 0; i < n; i++) { 
       while(!A[i].empty()) A[i].pop(); 
       A[i].push(0);
     }
}

void put_it1(int a, int b, int z)
{
     int i;
     
     for(i = a; i < b; i++) A[i].push(z); 
}

int get_it1(int a)
{   
    return A[a].top();
}

void remove_it1(int a, int b)
{
     int i;
     
     for(i = a; i < b; i++) A[i].pop();
}
