var n,m,k,a,b,i,j,op:integer;
q:array [0..2000,0..2000] of longint;
z:longint;
f,g:text;
procedure citire;
var i,j:integer;
begin
readln(f,n,m,z,a,b);
for i:=0 to n do
for j:=0 to n do q[i,j]:=((a+j)*(i+b) div 4) mod z;
end;
procedure op1(i,j:integer);
var x,y,y1:integer;
aux:longint;
begin
for x:=i to j div 2 do
begin
y1:=j+1;
for y:=i to j do
begin
y1:=y1-1;
aux:=q[x,y];
q[x,y]:=q[j+1-x,y1];
q[j+1-x,y1]:=aux;
end;
end;
if j mod 2=1 then
for y:=i to j div 2 do
begin
aux:=q[j div 2+1,y];
q[j div 2+1,y]:=q[j div 2+1,j+1-y];
q[j div 2+1,j+1-y]:=aux;
end;
end;
procedure op2(i,j:integer);
var x,y:integer;
s:longint;
begin
s:=0;
for x:=i to j do
for y:=i to j do s:=s+q[x,y];
writeln(g,s);
end;
begin
assign(f,'eprubeta.in');
assign(g,'eprubeta.out');
reset(f);
rewrite(g);
citire;
for k:=1 to m do
begin
readln(f,op,i,j);
if op=1 then op1(i,j)
else op2(i,j);
end;
close(f);
close(g);
end.