萌新求助
查看原帖
萌新求助
171513
Polariserist楼主2020/8/4 19:19

求助RE(玄学?)

#include<bits/stdc++.h>
using namespace std;
long long tree[1005000];
int tl[1005000],tr[1005000],tmid[1005000];
int a[500070];
int n,m;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void make_tree(int x,int l,int r){
	tl[x]=l;
	tr[x]=r;
	if(l==r){
		tree[x]=a[l];
	}
	else{
		int mid=(l+r)/2;
		tmid[x]=mid;
		make_tree(x*2,l,mid);
		make_tree(x*2+1,mid+1,r);
		tree[x]=tree[x*2]+tree[x*2+1];
	}
}
void add(int x,int k,long long n){
	tree[x]+=n;
	if(tl[x]<tr[x]){
		if(k<=tmid[x])
			add(x*2,k,n);
		else add(x*2+1,k,n);
	}
}
long long find(int x,int l,int r){
	if(tl[x]==l && tr[x]==r)
		return tree[x];
	if(r<=tmid[x])
		return find(x*2,l,r);
	else if(l>=tmid[x])
		return find(x*2+1,l,r);
	return find(x*2,l,tmid[x])+find(x*2+1,tmid[x]+1,r);
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	make_tree(1,1,n);
	for(int i=1;i<=m;i++){
		int opt;
		opt=read();
		if(opt==1){
			int n;
			long long now;
			n=read();
			now=read();
			add(1,n,now);
		}
		if(opt==2){
			int a,b;
			a=read();
			b=read();
			long long ans=find(1,a,b);
			printf("%lld\n",ans);
		}
	}
	return 0;
}

2020/8/4 19:19
加载中...