program df;
type point=record
c,a,b,d:longint;
end;
var i,j,n,m,x,y,k,t,g,h:longint;
up,down,ans,z:int64;
f:array[0..500000] of point;
a:array[0..500000] of longint;
c:array[0..500000] of int64;
function gcd(x,y:int64):int64;
begin
if y=0 then exit(x)
else gcd:=gcd(y,x mod y);
end;
function max(x,y:int64):int64;
begin
if x>y then exit(x)
else exit(y);
end;
procedure built(x,y,z:longint);
begin
f[z].a:=x;
f[z].b:=y;
if x=y then
begin
f[z].c:=a[x];
exit;
end;
built(x,(x+y) div 2,z*2);
built((x+y) div 2+1,y,z*2+1);
f[z].c:=f[z*2].c+f[z*2+1].c;
end;
procedure xiugai(k:longint);
begin
if f[k].d<>0 then
begin
f[k*2].c:=f[k*2].c+(f[k*2].b-f[k*2].a+1)*f[k].d;
f[k*2].d:=f[k*2].d+f[k].d;
f[k*2+1].c:=f[k*2+1].c+(f[k*2+1].b-f[k*2+1].a+1)*f[k].d;
f[k*2+1].d:=f[k*2+1].d+f[k].d;
f[k].d:=0;
end;
end;
procedure change(x,y,k:longint);
var mid:longint;
begin
if (f[k].a=x)and(f[k].b=y) then
begin
f[k].c:=f[k].c+(f[k].b-f[k].a+1)*z;
f[k].d:=f[k].d+z;
exit;
end;
xiugai(k);
mid:=(f[k].a+f[k].b) div 2;
if y<=mid then change(x,y,k*2)
else if x>mid then change(x,y,k*2+1)
else
begin
change(x,mid,k*2);
change(mid+1,y,k*2+1);
end;
f[k].c:=f[k*2].c+f[k*2+1].c;
end;
function add(x,y,k:longint):int64;
var mid:longint;
begin
if (f[k].a=x)and(f[k].b=y) then
exit(f[k].c);
xiugai(k);
mid:=(f[k].a+f[k].b) div 2;
if y<=mid then exit(add(x,y,k*2))
else if x>mid then exit(add(x,y,k*2+1))
else
exit(add(x,mid,k*2)+add(mid+1,y,k*2+1));
end;
procedure follow(x:longint);
begin
xiugai(x);
if (g<=f[x].a) and (h>=f[x].b) and (f[x].a=f[x].b) then
begin
ans:=ans+sqr(f[x].c*down-up); //f[x].c乘平均数分母的平方
exit;
end;
if f[x].a小于f[x].b then
begin
if g<=(f[x].a+f[x].b) div 2 then follow(x*2);
if h>=(f[x].a+f[x].b) div 2 then follow(x*2+1);
f[x].c:=max(f[x].c,f[x*2].c+f[x*2+1].c);
end;
end;
begin
assign(input,’classroom.in’);
reset(input);
assign(output,’classroom.out’);
rewrite(output);
readln(n,m);
for i:=1 to n do
read(a[i]);
built(1,n,1);
for i:=1 to m do
begin
read(x);
if x=1 then
begin
readln(g,h,z);
change(g,h,1);
end;
if (x=2) or (x=3) then
begin
readln(g,h);
down:=h-g+1;
up:=add(g,h,1);
z:=gcd(up,down);
up:=up div z;
down:=down div z;
if x=2 then writeln(up,’/’,down);
if x=3 then
begin
ans:=0;
follow(1);
down:=(h-g+1)*down*down; //让分子分母同乘平均数分母的平方
z:=gcd(ans,down);
ans:=ans div z;
down:=down div z;
writeln(ans,’/’,down);
end;
end;
end;
close(input);
close(output);
end.