线段树10pts求调(玄关
查看原帖
线段树10pts求调(玄关
1423269
ini_____楼主2024/10/25 10:13
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e5+5;
int n,m;
int a[N],sum[4*N],lazy[4*N];
void build(int index,int l,int r){
	if(l==r){
		sum[index]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(index*2,l,mid);
	build(index*2+1,mid+1,r);
	sum[index]=sum[index*2]+sum[index*2+1];
}
void range_update(int index,int l,int r,int x,int y,int k){
	if(x<=l and r<=y){
		sum[index]+=(r-l+1)*k;
		lazy[index]+=k;
		return;
	}
	int mid=(l+r)>>1;
	if(mid>=x)range_update(index*2,l,mid,x,y,k);
	if(mid+1<=y)range_update(index*2+1,mid+1,r,x,y,k);
	sum[index]=sum[index*2]+sum[index*2+1];
}
int range_query(int index,int l,int r,int x,int y){
	if(x<=l and r<=y)return sum[index];
	int mid=(l+r)>>1;
	if(lazy[index]){
		range_update(index*2,l,mid,1,n,lazy[index]);
		range_update(index*2+1,mid+1,r,1,n,lazy[index]);
		lazy[index]=0;
	} 
	int ans=0;
	if(mid>=x)ans+=range_query(index*2,l,mid,x,y);
	if(mid+1<=y)ans+=range_query(index*2+1,mid+1,r,x,y);
	return ans;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	for(int i=0;i<m;i++){
		int op,x,y,k;
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			range_update(1,1,n,x,y,k);
		}
		else{
			cout<<range_query(1,1,n,x,y)<<endl;
		}
	}
}

只有10pts,除了第一个测试点全部WA

2024/10/25 10:13
加载中...