本地能运行,洛谷CE
查看原帖
本地能运行,洛谷CE
912241
dream_on_screen楼主2023/3/18 12:37

而且还没有错误提示

提交记录

#include <bits/stdc++.h>
using namespace std;
struct node
{
	int value=-1;
	int left=-1,right=-1;
};
int a[500005];
node tree[2000005];
void build(int id,int left,int right)
{
	if(right<left)
		return ;
	if(right!=left)
	{
		tree[id].left=left;
		tree[id].right=right;
		build(id*2,left,(left+right)/2);
		build(id*2+1,(left+right)/2+1,right);
		tree[id].value=tree[id*2].value+tree[id*2+1].value;
		return;
	}
	else if(left==right)
	{
		tree[id].left=left;
		tree[id].right=right;
		tree[id].value=a[left];
		return ;
	}
	return ;
}
int n,m;
int find(int id,int value_id)
{
	if(tree[id].left==value_id&&tree[id].right==value_id)
		return id;
	else if(tree[id*2].left<=value_id&&tree[id*2].right>=value_id)
		return find(id*2,value_id);
	else if(tree[id*2+1].left<=value_id&&tree[id*2+1].right>=value_id)
		return find(id*2+1,value_id);
	exit(1);
}
void add(int id,int b)
{
	int i=find(1,id);
	while(i>0)
	{
		tree[i].value+=b;
		i/=2;
	}
	return ;
}
int sum(int id,int l,int r)
{
	if(l==tree[id].left&&r==tree[id].right)
		return tree[id].value;
	bool b1=false,b2=false;
	if(tree[id*2].left<=l&&tree[id*2].right>=l)
		b1=true;
	if(tree[id*2+1].left<=r&&tree[id*2+1].right>=r)
		b2=true;
	if(b1&&!b2)
		return sum(id*2,l,r);
	else if(!b1&&b2)
		return sum(id*2+1,l,r);
	else if(b1&&b2)
		return sum(id*2,l,tree[id*2].right)+sum(id*2+1,tree[id*2+1].left,r);
	else if(!b1&&!b2)
		return 0;
	exit(1);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int b;
		cin>>b;
		if(b==1)
		{
			int x,y;
			cin>>x>>y;
			add(x,y);
		}
		else if(b==2)
		{
			int l,r;
			cin>>l>>r;
			cout<<sum(1,l,r)<<"\n";
		}
	}
}
2023/3/18 12:37
加载中...