求助
查看原帖
求助
511408
Rash10楼主2021/10/13 15:54
#include<bits/stdc++.h>
using namespace std;
int n,m,c[100001],cf[100001],ans;
inline int read(){
	int w=0,s=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			s=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		w=w*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
struct SegmentTree{
	int l,r,sum;
}t[400001];
void build(int p,int l,int r){
	t[p].l=l;
	t[p].r=r;
	if(l==r){
		t[p].sum=c[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].sum=t[p*2].sum+t[p*2+1].sum;
}
int ask(int p,int x,int y){
	if(x<=t[p].l&&t[p].r<=y){
		return t[p].sum;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(x<=mid){	
		return ans+=ask(p*2,x,mid);
	}
	if(x>mid){
		return ans+=ask(p*2+1,mid+1,y);
	}
	return ans;
}
int main(){
	n=read();
	m=read();
	for(register int i=1;i<=n;++i){
		c[i]=read();
	}
	build(1,1,n);
//	for(register int i=1;i<=n;++i){
//		cout<<t[i].sum<<' '<<t[i].l<<' '<<t[i].r<<endl;
//	}
	for(register int i=1;i<=m;++i){
		int a;
		a=read();
		if(a==1){
			int x,y,k;
			x=read();
			y=read();
			k=read();
			cf[x]+=k;
			cf[y+1]-=k;
			for(register int j=1;j<=n;++j){
				cf[j]+=cf[j-1];
			}
			for(register int j=1;j<=n;++j){
				c[j]+=cf[j];
			}
		}
		if(a==2){
			int x,y;
			x=read();
			y=read();
			cout<<ask(1,x,y)<<endl;
		}
	memset(cf,0,sizeof(cf));
	ans=0;
	}
	return 0;
}

样例都过不了,求调,谢谢了

2021/10/13 15:54
加载中...