70tps求调
查看原帖
70tps求调
671330
rdrding楼主2025/1/4 21:56

三个点被tle了

#include <bits/stdc++.h>
using namespace std;
const int N = 1e7+10;
long long n,m,a[N],q,x,y,k;
struct node{
	long long val,left,right;
}g[N];
void init(long long l,long long r,int b){
	if(l==r){
		g[b].val=a[l];
		g[b].left=l;
		g[b].right=r;
		return;
	}
	long long mid=(l+r)>>1;
	init(l,mid,b*2);
	init(mid+1,r,b*2+1);
	g[b].val=g[b*2].val+g[b*2+1].val;
	g[b].left=l;
	g[b].right=r;
}
void add(long long l,long long r,long long x,long long y,long long k,int b){
	if(l>y || r<x)return;
	if(l==r){
		g[b].val+=k;
		return;
	}
	long long mid=(l+r)>>1;
	add(l,mid,x,y,k,b*2);
	add(mid+1,r,x,y,k,b*2+1);
	g[b].val=g[b*2].val+g[b*2+1].val;
}
long long pnt(long long l,long long r,long long x,long long y,int b){
	if(l>y || r<x || x>y)return 0;
	long long ans=0;//1 3 2 3
	ans += pnt(g[b*2+1].left,g[b*2+1].right,x,y,b*2+1);
	ans += pnt(g[b*2].left,g[b*2].right,x,y,b*2);
	if(l==r){
		ans += g[b].val;
	}
	return ans;
}
int main(){
	
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	init(1,n,1);
	while(m--){
		cin>>q>>x>>y;
		if(q==1){
			cin>>k;
			add(1,n,x,y,k,1);
		}else{
			//question
			cout<<pnt(g[1].left,g[1].right,x,y,1)<<endl;
		}
	}
	
	return 0;
}
2025/1/4 21:56
加载中...