{
ZADATAK: atomi
JEZIK: PASCAL
}

type
  niz=array[1..125001]of longint;
var
  pocetak,kraj:niz;   //gde je pocetak a gd kraj intervala;
  d,gde,br,a,b,n,m,i:longint;
  operacija,pom,max,tren:longint;
  f,g:text;

  function Find(var br:longint):longint; //varaca samo ako je u intervalu (za delete)
    var
      levo,desno,sred:longint;
    begin
      levo:=0;
      desno:=d;

      sred:=-1;
      while levo<=desno do
        begin
          sred:=(levo+desno)div 2;
          if ((pocetak[sred]<=br)and(kraj[sred]>=br))
             then levo:=desno+1    //izlazi iz while-a
             else if pocetak[sred]>br
                    then desno:=sred-1
                    else levo:=sred+1;
        end;

      if (sred<>-1)and((pocetak[sred]<=br)and(kraj[sred]>=br))  //alp je nasao resejne

        then Find:=sred
        else Find:=0;
    end;

  function Find2(var br:longint):longint;    //vraca i ako je na ivici intervala (za insert)
    v
        then Find:=sred
        else Find:=0;
    end;

  function Find2(var br:longint):longint;    //vraca i ako je na ivici intervala (za insert)
    v
        then Find:=sred
        else Find:=0;
+1)and(kraj[sred]>=br-1))
             then lnt):longint;    //vraca i ako je na ivici intervala (za insert)
    v
        then Find:=sred
        else Find:=0;
+1)and(kraj[sred]>=br-1))
             then lnt):longint;    //vraca i ako je na ivici interv+1)and(kraj[sred]>=br-1))  //alp je nasao resejne

        then begin
              while (sred>1)and((pocetak[sred-1]<=br+1)and(kraj[sred-1]>=br-1)) do
                sred:=sred-1;

              Find2:=sred;
             end
        else Find2:=0;
    end;

  function Find3(var a,b:longint):longint;
    var
              then begin
              while (sred>1)and((pocetak[sred-1]<=br+1)and(kraj[sred-1]>=br-1)) do
                sred:=sred-1;

              Find2:=sred;
             end
(pocetak[sred]>=a)and(pocetak[sred]<=b))or((pocetak[sred]<a)and(kraj[sred]>a)))
             then levo:=desno+1    //izlazi iz while-a
             else if pocetak[sred]>a
                    then desno:=sred-1
                    else levo:=sred+1;
        end;

      if (sred<>-1)and(((pocetak[sred]>=a)and(pocetak[sred]<=b))or((pocetak[sred]<a)and(kraj[sred]>a)))  //alp je nasao resejne

        then begin
              while (sred>1)and((kraj[gde-1]>a)or(pocetak[gde-1]>a)) do
                sred:=sred-1;

              Find3:=sred;
             end
        else Find3:=0;
    end;


  procedure Obrisi(x:longint);    //brise neki interval
    begin
      x:=x+1;
      while (x<=d) do
        begin
          pocetak[x-1]:=pocetak[x];
          kraj[x-1]:=kraj[x];

          x:=x+1;
        end;

      d:=d-1;
    end;

  procedure Insert(poc,kr:longint);   //ubacuje nov interval (poc,kr)
    var                                   //tako da se ocuva rastuci poredak
      i:longint;
    begin
      d:=d+1;
      i:=d;
      while (i>1)and(pocetak[i-1]>poc) do
        begin
          pocetak[i]:=pocetak[i-1];
          kraj[i]:=kraj[i-1];

          i:=i-1;
        end;

      pocetak[i]:=poc;
      kraj[i]:=kr;
    end;


begin
  assign(f,'atomi.in'); reset(f);
  assign(g,'atomi.out'); rewrite(g);

  readln(f,n,m);

  d:=0;       //duzina intervala pocetak/kraj

  for i:=1 to m do
    begin
      read(f,operacija);

      case operacija of
        0:begin
            readln(f,br);
            gde:=Find(br);    //u kom intervalu se nalazi taj broj

            if (gde>0)
              then begin  //ako ima tog broja
                    //ako je na pocetku ili na kraju intervala
                    //(pazi na slucaj kada je interval samo jedan broj)
                    if (pocetak[gde]=br)
                      then if kraj[gde]=br
                            then Obrisi(gde)
                            else pocetak[gde]:=pocetak[gde]+1

                      else if kraj[gde]=br
                            then kraj[gde]:=kraj[gde-1]
                            else begin    //jedan interval delimo na dva
                                  pom:=kraj[gde];

                                  //prvi interval
                                  kraj[gde]:=br-1;

                                  Insert(br+1,pom);   //drugi interval
                                 end;

                   end;
          end;
        1:begin
            readln(f,br);

            gde:=Find2(br);

            if gde=0
              then Insert(br,br) //poceinjemo novi interval
              else begin
                    if (br=pocetak[gde]-1)
                      then pocetak[gde]:=pocetak[gde]+1
                      else if (br=kraj[gde]+1)
                            then if (gde<d)and(br=pocetak[gde+1]-1)
                                  then begin    //spajamo dva intervala
                                        kraj[gde]:=kraj[gde+1];
                                        Obrisi(gde+1);
                                       end
                                  else kraj[gde]:=kraj[gde]+1;
                   end;
             //Napomenaako ubacujemo unutar nekog intervala onda nista

          end;
        2:begin
            readln(f,a,b);

            gde:=Find3(a,b);

            max:=0;
            if gde<>0
              then begin
                    if pocetak[gde]<a
                      then begin
                            if kraj[gde]>b
                              then max:=b-a+1
                              else max:=kraj[gde]-a+1;
                            gde:=gde+1;
                           end;

                    while (gde<=d)and(pocetak[gde]<=b) do
                      begin
                        if kraj[gde]<=b
                          then tren:=kraj[gde]-pocetak[gde]+1
                          else tren:=b-kraj[gde]+1;

                        if max<tren then max:=tren;
                        gde:=gde+1;
                      end;
                   end;

            writeln(g,max);
          end;
      end;


    end;


  close(f);
  close(g);


end.
