```cpp
#include<iostream>
#include<cctype>
#include<cstdio>
#include<algorithm>
#define h -9999999999
#define N 220000
#define inf 1e9+7
#define ll long long
using namespace std;
inline ll read()
{
ll x=0,flag=1;
char ch=0;
while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
while(isdigit(ch)) {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*flag;
}
double a[N],b[N];
struct node
{
double sumx;
double sumy;
double sqrx;
double mulv;
};
node operator+(node a,node b){return (node){a.sumx+b.sumx,a.sumy+b.sumy,a.sqrx+b.sqrx,a.mulv+b.mulv};}
struct Segment_Tree
{
#define lson (o<<1)
#define rson (o<<1|1)
#define mid ((int)(l+r)/2)
double sumx[N*4],sumy[N*4],sqrx[N*4],mulv[N*4],addx[N*4],addy[N*4],setx[N*4],sety[N*4];
inline void pushup(ll o)
{
sumx[o]=sumx[lson]+sumx[rson];
sumy[o]=sumy[lson]+sumy[rson];
sqrx[o]=sqrx[lson]+sqrx[rson];
mulv[o]=mulv[lson]+mulv[rson];
}
inline void pushdown(ll o,ll l,ll r)
{
if(setx[o]!=h||sety[o]!=h)
{
setx[lson]=setx[rson]=setx[o];
sety[lson]=sety[rson]=sety[o];
double l1=(mid-l+1);
double l2=(r-mid);
double s1=((l+mid)*l1/(2.0));
double s2=((mid+1+r)*l2/(2.0));
sumx[lson]=s1+setx[o]*l1;
sumx[rson]=s2+setx[o]*l2;
sumy[lson]=s1+sety[o]*l1;
sumy[rson]=s2+sety[o]*l2;
addx[lson]=addx[rson]=0;
addy[lson]=addy[rson]=0;
double s1_=((mid)*(mid+1)*(2*mid+1)-(l-1)*(l)*(2*l-1))/(6.0);
double s2_=((r)*(r+1)*(2*r+1)-(mid)*(mid+1)*(2*mid+1))/(6.0);
// printf("%lf %lf\n",s1,s1_);
// printf("%lf %lf\n",s2,s2_);
mulv[lson]=s1_+(setx[o]+sety[o])*s1+l1*(setx[o]*sety[o]);
mulv[rson]=s2_+(setx[o]+sety[o])*s2+l2*(setx[o]*sety[o]);
sqrx[lson]=s1_+2*setx[o]*s1+l1*(setx[o]*setx[o]);
sqrx[rson]=s2_+2*setx[o]*s2+l2*(setx[o]*setx[o]);
// printf("%lf %lf %lf %lf %lf %lf\n",sumx[lson],sqrx[lson],mulv[lson],sumx[rson],sqrx[rson],mulv[rson]);
setx[o]=sety[o]=h;
}
if(addx[o]||addy[o])
{
double l1=(mid-l+1);
double l2=(r-mid);
addx[lson]+=addx[o];
addx[rson]+=addx[o];
addy[lson]+=addy[o];
addy[rson]+=addy[o];
sqrx[lson]+=2*sumx[lson]*addx[o]+(addx[o]*addx[o])*l1;
sqrx[rson]+=2*sumx[rson]*addx[o]+(addx[o]*addx[o])*l2;
mulv[lson]+=addy[o]*sumx[lson] + addx[o]*sumy[lson] + (addx[o]*addy[o])*l1;
mulv[rson]+=addy[o]*sumx[rson] + addx[o]*sumy[rson] + (addx[o]*addy[o])*l2;
sumx[lson]+=l1*addx[o];
sumx[rson]+=l2*addx[o];
sumy[lson]+=l1*addy[o];
sumy[rson]+=l2*addy[o];
addx[o]=addy[o]=0;
}
}
void build(ll o,ll l,ll r)
{
setx[o]=sety[o]=h;
if(l==r)
{
sumx[o]=a[l];
sumy[o]=b[l];
sqrx[o]=a[l]*a[l];
mulv[o]=a[l]*b[l];
return;
}
build(lson,l,mid);
build(rson,mid+1,r);
pushup(o);
}
void optadd(ll o,ll l,ll r,ll ql,ll qr,double s,double t)
{
if(ql<=l&&r<=qr)
{
double len=(r-l+1);
addx[o]+=s;
addy[o]+=t;
sqrx[o]+=2*sumx[o]*s+(s*s)*len;
mulv[o]+=t*sumx[o] + s*sumy[o] + (s*t)*len;
sumx[o]+=len*s;
sumy[o]+=len*t;
return;
}
pushdown(o,l,r);
if(ql<=mid)optadd(lson,l,mid,ql,qr,s,t);
if(qr>mid)optadd(rson,mid+1,r,ql,qr,s,t);
pushup(o);
}
void optset(ll o,ll l,ll r,ll ql,ll qr,double s,double t)
{
if(ql<=l&&r<=qr)
{
double len=(r-l+1);
// printf("%d %d %d %d\n",l,r,ql,qr);
setx[o]=s;
sety[o]=t;
double s1=((l+r)*len)/(2.0);
sumx[o]=s1+s*len;
sumy[o]=s1+t*len;
addx[o]=0;
addy[o]=0;
double s_=((r)*(r+1)*(2*r+1)-(l-1)*(l)*(2*l-1))/(6.0);
mulv[o]=s_+(s+t)*s1+len*(s*t);
sqrx[o]=s_+2*s*s1+len*(s*s);
// printf("%lf %lf\n",s_);
return;
}
pushdown(o,l,r);
if(ql<=mid)optset(lson,l,mid,ql,qr,s,t);
if(qr>mid)optset(rson,mid+1,r,ql,qr,s,t);
pushup(o);
}
node query(ll o,ll l,ll r,ll ql,ll qr)
{
if(ql<=l&&r<=qr)
return (node){sumx[o],sumy[o],sqrx[o],mulv[o]};
pushdown(o,l,r);
node ans={0,0,0,0};
if(ql<=mid)ans=ans+query(lson,l,mid,ql,qr);
if(qr>mid)ans=ans+query(rson,mid+1,r,ql,qr);
return ans;
}
}T;
int main()
{
// freopen("AU.out","w",stdout);
ll n,m,i,flag,l,r;
double x,y;
n=read();
m=read();
for(i=1;i<=n;i++)
scanf("%lf",&a[i]);
for(i=1;i<=n;i++)
scanf("%lf",&b[i]);
T.build(1,1,n);
for(i=1;i<=m;i++)
{
flag=read();
l=read();
r=read();
if(flag==1)
{
node k=T.query(1,1,n,l,r);
double s1=k.sumx;
double s2=k.sumy;
double s3=k.sqrx;
double s4=k.mulv;
double len=(r-l+1);
double up=s4-(s1*s2)/len;
double down=s3-(s1*s1)/len;
// printf("%lf %lf %lf %lf\n",s1,s2,s4,s3);
printf("%.10lf\n",up/down);
}
if(flag==2)
{
scanf("%lf%lf",&x,&y);
T.optadd(1,1,n,l,r,x,y);
}
if(flag==3)
{
scanf("%lf%lf",&x,&y);
T.optset(1,1,n,l,r,x,y);
}
}
return 0;
}
```
by 大吉大利 @ 2018-07-31 14:33:35