线段树70pts TLE求助
查看原帖
线段树70pts TLE求助
664744
Nwayy楼主2022/11/30 22:40
#include<bits/stdc++.h>
#define N 500005
#define int long long
using namespace std;
int n,m,i,j,ans,a[N],x,y,k,id;
int d[N<<2];
void build(int l,int r,int p){
	if(l==r){
		d[p]=a[l];
		return;
	}
	int m=(l+r)>>1;
	build(l,m,p<<1);
	build(m+1,r,(p<<1)+1);
	d[p]=d[p<<1]+d[(p<<1)+1];
}
int getsum(int s,int t,int l,int r,int p){
	if(s<=l && r<=t) return d[p];
	int m=(l+r)>>1,sum=0;
	if(s<=m) sum+=getsum(s,t,l,m,p<<1);
	if(t>m)  sum+=getsum(s,t,m+1,r,(p<<1)+1);
	return sum;
}
void update(int s,int c,int l,int r,int p){
	if(s>=l && s<=r) d[p]+=c;
	if(l==r) return;
	int m=(l+r)>>1;
	if(l<=m) update(s,c,l,m,p<<1);
	if(r>m)  update(s,c,m+1,r,(p<<1)+1);
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,n,1);
	for(i=1;i<=m;i++){
		scanf("%lld%lld%lld",&id,&x,&k);
		if(id==1) update(x,k,1,n,1);
		if(id==2){
			ans=getsum(x,k,1,n,1);
			printf("%lld\n",ans);
		}
	}
	return 0;
}

求助。

2022/11/30 22:40
加载中...