记录
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N=1e5+5;
int n,m,opt,x,y,k,a[N],sum[4*N],sum2[4*N],tag[4*N];
void push_up(int cur){
sum[cur]=sum[cur<<1]+sum[cur<<1|1];
sum2[cur]=sum2[cur<<1]+sum2[cur<<1|1];
return;
}
void build(int cur,int lt,int rt){
if(lt==rt){
sum[cur]=a[lt];
sum2[cur]=a[lt]*a[lt];
return;
}
int mid=lt+rt>>1;
build(cur<<1,lt,mid);
build(cur<<1|1,mid+1,rt);
push_up(cur);
return;
}
void add_tag(int cur,int lt,int rt,int val){
tag[cur]+=val;
sum2[cur]+=(rt-lt+1)*val*val+2*sum[cur]*val;
sum[cur]+=(rt-lt+1)*val;
return;
}
void push_down(int cur,int lt,int rt){
if(!tag[cur]) return;
int mid=lt+rt>>1;
add_tag(cur<<1,lt,mid,tag[cur]);
add_tag(cur<<1|1,mid+1,rt,tag[cur]);
tag[cur]=0;
return;
}
void update(int cur,int lt,int rt,int qx,int qy,int val){
if(rt<qx || lt>qy) return;
if(lt>=qx && rt<=qy){
add_tag(cur,lt,rt,val);
return;
}
push_down(cur,lt,rt);
int mid=lt+rt>>1;
update(cur<<1,lt,mid,qx,qy,val);
update(cur<<1|1,mid+1,rt,qx,qy,val);
push_up(cur);
return;
}
int query(int cur,int lt,int rt,int qx,int qy){
if(rt<qx || lt>qy) return 0;
if(lt>=qx && rt<=qy) return sum[cur];
push_down(cur,lt,rt);
int mid=lt+rt>>1;
return query(cur<<1,lt,mid,qx,qy)+query(cur<<1|1,mid+1,rt,qx,qy);
}
int query2(int cur,int lt,int rt,int qx,int qy){
if(rt<qx || lt>qy) return 0;
if(lt>=qx && rt<=qy) return sum2[cur];
push_down(cur,lt,rt);
int mid=lt+rt>>1;
return query2(cur<<1,lt,mid,qx,qy)+query2(cur<<1|1,mid+1,rt,qx,qy);
}
int gcd(int x,int y){
if(x>y) swap(x,y);
return !x?y:gcd(y%x,x);
}
void print(int x,int y){
if(!x){
cout<<"0/1\n";
return;
}
k=gcd(x,y);
cout<<x/k<<'/'<<y/k<<'\n';
return;
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
cin>>opt>>x>>y;
if(opt==1){
cin>>k;
update(1,1,n,x,y,k);
}else if(opt==2) print(query(1,1,n,x,y),y-x+1);
else print(query2(1,1,n,x,y)*(y-x+1)-pow(query(1,1,n,x,y),2),pow(y-x+1,2));
}
return 0;
}