小苯的蓄水池线段树写法求debug:能过样例但零分
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
double t[N];
double up[N],s[N];
double n,m;
void build(int rt,int l,int r) {
if(l==r) {
t[rt]=1;
return ;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
t[rt]=t[rt<<1]+t[rt<<1|1];
}
void push_down(int rt,int l,int r) {
if(up[rt]) {
int mid=(l+r)>>1;
t[rt<<1]=up[rt]*(mid-l+1);
t[rt<<1|1]=up[rt]*(r-mid);
up[rt<<1]=up[rt];
up[rt<<1|1]=up[rt];
up[rt]=0;
}
}
void update(int rt,int l,int r,double x,double y,double val) {
if(x<=l&&r<=y) {
t[rt]=val*(r-l+1);
up[rt]=val;
return ;
}
if(up[rt])
push_down(rt,l,r);
int mid=(l+r)>>1;
if(x<=mid)
update(rt<<1,l,mid,x,y,val);
if(y>mid)
update(rt<<1|1,mid+1,r,x,y,val);
t[rt]=t[rt<<1]+t[rt<<1|1];
}
double query(int rt,int l,int r,double x,double y) {
if(x<=l&&r<=y)
return t[rt];
if(up[rt])
push_down(rt,l,r);
int mid=(l+r)>>1;
double sum=0;
if(x<=mid)
sum+=query(rt<<1,l,mid,x,y);
if(y>mid)
sum+=query(rt<<1|1,mid+1,r,x,y);
return sum;
}
signed main() {
cin>>n>>m;
build(1,1,n);
memset(up,0,sizeof(up));
for(int i=1; i<=n; i++) {
cin>>up[i];
s[i]=s[i-1]+up[i];
}
int x,y;
double z;
while(m--) {
int op;
cin>>op;
if(op==1) {
cin>>x>>y;
z=(s[y]-s[x-1])/(y-x+1);
update(1,1,n,x,y,z);
} else {
cin>>x;
printf("%.7lf\n",query(1,1,n,x,x));
}
}
return 0;
}