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

using namespace std;

#define MAXN (1<<15)

typedef struct state {
    unsigned char col;
    int time;
    state() { col = time = 0; }
    state (unsigned char _col, int _time) {
        col = _col;
        time = _time;
    }
    bool operator < (const state & s) {
        return time > s.time;
    }
} state;

vector <state> tree[2*MAXN];
int N, M;
int ttime;

void update(int node, int left, int right, int start, int end, unsigned char col, bool del) {
    //printf("udpate %d %d %d %d %d %d %d\n", node, left, right, start, end, col, del);
    if (left >= start && right <= end) {
        if (del) {
            //printf("REMOVING %d\n", tree[node][tree[node].size()-1]);
            tree[node].pop_back();
        }
        else {
            tree[node].push_back(state(col, ttime));
        }
        return;
    }
    int mid = (left + right) / 2;
    if (mid >= end) {
        update(node*2, left, mid, start, end, col, del);
        return;
    }
    if (mid < start) {
        update(node*2+1, mid+1, right, start, end, col, del);
        return;
    }
    update(node*2, left, mid, start, mid, col, del);
    update(node*2+1, mid+1, right, mid+1, end, col, del);
}

state query(int node, int left, int right, int start, int end) {
    //printf("query %d %d %d %d %d\n", node, left, right, start, end);
    state r1 = state(0, -1), cr = state(0, -1);
    if (left <= start && right >= end && tree[node].size() > 0) {
        cr = tree[node][tree[node].size()-1];
    }
    
    if (left == right) {
        return cr;
    }
    
    int mid = (left + right) / 2;
    
    if (mid >= end) {
        r1 = query(node*2, left, mid, start, end);
    }
    else {
        r1 = query(node*2+1, mid+1, right, start, end);
    }
    if (r1.time == -1) {
        return cr;
    }
    if (cr.time == -1) {
        return r1;
    }
    return cr < r1 ? cr : r1;
}


int main() {
    
    scanf("%d%d", &N, &M);
    
    for (int i = 0; i <= N; i++) {
        tree[MAXN+i].push_back(state(((unsigned char)0),0));
    }
    
    int start, end;
    int col;
    int op;
    state ans;
    
    for (ttime = 1; ttime <= M; ttime++) {
        scanf("%d", &op);
        if (op == 3) {
            scanf("%d", &start);
            start++;
            end = start;
            ans = query(1, 1, MAXN, start, end);
            printf("%d\n", ans.col );
        }
        if (op == 2) {
            scanf("%d%d", &start, &end);
            start++;
            update(1, 1, MAXN, start, end, 0, true);
        }
        if (op == 1) {
            scanf("%d%d%d", &start, &end, &col);
            start++;
            update(1, 1, MAXN, start, end, ((unsigned char)col), false);
        }
    }
    
    return 0;
}
            
