30分悬关求调
查看原帖
30分悬关求调
227403
紫玄月楼主2024/3/3 12:07

用的线段树,只有30分,查不出来哪里错了

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn = 4 * 2000010;
ll n, m, a[maxn], sum[maxn], addv[maxn];
//ll l, r;
void build(ll o,ll l,ll r){
	if(l==r){
		sum[o]=a[l];
		return;
	}
	ll lc=2*o,rc=2*o+1;
	ll c=l+(r-l)/2;
	build(lc,l,c);
	build(rc,c+1,r);
	sum[o]=sum[lc]+sum[rc];
}
void maintain(ll o,ll l,ll r){
	ll lc=2*o,rc=2*o+1;
	if(r>l)
		sum[o]=sum[lc]+sum[rc];
	sum[o]+=addv[o]*(r-l+1);
}
ll ql,qr,v;
void update(ll o,ll l,ll r){
	ll lc=2*o,rc=2*o+1;
	ll c=l+(r-l)/2;
	if(ql<=l&&qr>=r){
		addv[o]+=v;
	}
	else{
		if(ql<=c)
			update(lc,l,c);
		if(qr>c)
			update(rc,c+1,r);
	}
	maintain(o,l,r);
}
ll sumv;
void query(ll o,ll l,ll r,ll add){
	ll c=l+(r-l)/2;
	ll lc=2*o,rc=2*o+1;
	if(ql<=l&&qr>=r)
		sumv+=sum[o]+add*(r-l+1);
	else{
		if(ql<=c)
			query(lc,l,c,addv[o]+add);
		if(qr>c)
			query(rc,c+1,r,addv[o]+add);
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);	
	while(m--){
		ll f;
		cin>>f>>ql>>qr;
		if(f==1){
			cin>>v;
			update(1,1,n);
		}
		if(f==2){
			sumv=0;
			query(1,1,n,0);
			cout<<sumv<<endl;
		}
	}
	return 0;
}
2024/3/3 12:07
加载中...