小苯的蓄水池线段树写法求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;
}