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

#include <cstdio>
#include <cstdlib>
#include <vector>

const int MAXN = 1 << 15;//32 000

int N, M;
std::vector <int> idt[MAXN * 2];
int __caid;

void add (int l, int r, int lb, int rb, int p, int val) {
	if (l < lb) l = lb;
	if (r > rb) r = rb;
	if (l >= r) return;
//	printf ("add %d %d %d %d %d %d\n", l, r, lb, rb, p, val);
	if (l == lb && r == rb) {
//		printf ("stop here!\n");
		if (val >= 0) idt[p].push_back (val);
		else idt[p].pop_back ();
		return;
	}
	int m = (lb + rb) >> 1;
	add (l, r, lb, m, p*2+1, val);
	add (l, r, m, rb, p*2+2, val);
}


int srch (int pos, int lb, int rb, int p) {
	int m = (lb + rb) >> 1;
//	printf ("srch %d %d %d %d\n", pos, lb, rb, p);
	if (lb + 1 == rb) return (idt[p].size () ? idt[p].back () : -1);
	if (pos < m)
		return srch (pos, lb, m, p*2+1) >? (idt[p].size () ? idt[p].back () : -1);
	else
	    return srch (pos, m, rb, p*2+2) >? (idt[p].size () ? idt[p].back () : -1);
}

void prnt () {
	for (int i = 0; i < 2 * N - 1; ++i) {
//		printf ("idt[%d].size () == %u\n", i, idt[i].size ());
//		system ("PAUSE");
		for (int j = 0; j < idt[i].size (); ++j)
		    printf ("%d ", idt[i][j]);
		printf ("  __%d\n", i);
//		system ("PAUSE");
	}
}

int main () {
	scanf ("%d %d", &N, &M);

	N = 1 << (32 - __builtin_clz (N));
//	printf ("N = %d\n", N);
//	return 0;

	add (0, N, 0, N, 0, 0);//the while ruler
//	return 0;
//	prnt ();
//	return 0;

	int i;
	int a, b, c, t;
	for (i = 0; i < M; ++i) {
		scanf ("%d", &t);
		switch (t) {
			case 1: scanf ("%d %d %d", &a, &b, &c);
					add (a, b, 0, N, 0, (++__caid << 8) + c);
//					prnt ();
					break;
			case 2: scanf ("%d %d", &a, &b);
					add (a, b, 0, N, 0, -1);
//					prnt ();
					break;
			case 3: scanf ("%d", &a); printf ("%d\n", srch (a, 0, N, 0) & 255); break;
		}
	}

	return 0;
}
