{
TASK:bands
LANG:Pascal
}
program bands;
type mas=array[0..20000,1..44000]of byte;
type masint=array[0..100000,0..2] of integer;
type masbyte=array[0..100000,0..2] of byte;
var l:mas;
    wc:masbyte;
    ij:masint;
    b:boolean;
    q,k,n,m,s,p:integer;
begin
b:=false;
readln(n,m);
for k:=1 to m do
begin
read(wc[k,1]);
if wc[k,1]=1 then read(ij[k,1],ij[k,2],wc[k,2]);
if wc[k,1]=2 then begin b:=true; read(ij[k,1],ij[k,2]); end;
if wc[k,1]=3 then read(ij[k,1]);
end;




if b=false then
for k:=1 to m do
begin
if wc[k,1]=1 then for q:=ij[k,1] to ij[k,2] do l[q,1]:=wc[k,2];
if wc[k,1]=2 then wc[k,1]:=2;
if wc[k,1]=3 then writeln(l[ij[k,1],1]);
end;

p:=1;

if b=true then

for k:=1 to m do

begin

if wc[k,1]=1 then

begin
p:=p+1;
for s:=1 to n do l[s,p]:=l[s,p-1];
for q:=ij[k,1] to ij[k,2] do l[q,p]:=wc[k,2];
end;

if wc[k,1]=2 then

begin
for q:=ij[k,1] to ij[k,2] do if l[q,p]=0 then b:=false;
if b=true then
for q:=ij[k,1] to ij[k,2] do
for s:=p-1 downto 1 do
if l[q,s]<>l[q,p] then begin l[q,p]:=l[q,s]; break; end;
end;

if b=false then b:=true;
if wc[k,1]=3 then writeln(l[ij[k,1],p]);
end;


end.
