WA求助
查看原帖
WA求助
997515
Y_Naidong楼主2024/7/12 21:18

WA求助,样例过不了,看不出问题,求助大佬,HELP!!!

#include<bits/stdc++.h>
using namespace std;
const int N=1e7;
int n,m;
int a[N],tr[N],lazy[N];
void up(int ix){
	tr[ix]=tr[ix*2]+tr[ix*2+1];
}
void build(int l,int r,int ix){
	if(l==r){
		tr[ix]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,ix*2);
	build(mid+1,r,ix*2+1);
	up(ix);
}
void down(int l,int r,int ix){
	if(lazy[ix]){
		lazy[ix*2]+=lazy[ix];
		lazy[ix*2+1]+=lazy[ix];
		int mid=(r+l)/2;
		tr[ix*2]+=lazy[ix]*(mid+1-l);
		tr[ix*2+1]+=lazy[ix]*(r-mid);
		lazy[ix]=0;
	}
}
void change(int l,int r,int ix,int x,int y,int k){
	if(l>=x&&r<=y){
		tr[ix]+=k*(r-l+1);
		lazy[ix]+=k;
		return;
	}
	down(l,r,ix);
	int mid=(r+l)/2;
	if(x<=mid)
		change(l,mid,ix*2,x,y,k);
	if(y>mid)
		change(mid+1,r,ix*2+1,x,y,k);
	up(ix); 
}
int find(int l,int r,int ix,int x,int y){
	if(l>=x&&r<=y)
		return tr[ix];
	int mid=(r+l)/2,ans=0;
	if(x<=mid)
		ans+=find(l,mid,ix*2,x,y);
	if(y>mid)
		ans+=find(mid+1,r,ix*2+1,x,y);
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int p,x,y;
		cin>>p;
		if(p==1){
			int k;
			cin>>x>>y>>k;
			change(1,n,1,x,y,k);
		}
		if(p==2){
			cin>>x>>y;
			cout<<find(1,n,1,x,y)<<endl;
		}
	}
	return 0;
}

2024/7/12 21:18
加载中...