线段树做法,样例没过求调
查看原帖
线段树做法,样例没过求调
923273
WAis_WonderfulAnswer楼主2023/10/28 16:07
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=(int)5e5;
struct node
{
	int ls,rs,s;
}s[N<<1];
int n,m,a[N],nd=0;
void update(int x)
{
	s[x].s=s[s[x].ls].s+s[s[x].rs].s;
}
void build(int id,int l,int r)
{
	if (l==r)
	{
		s[id].s=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(s[id].ls=++nd,l,mid);
	build(s[id].rs=++nd,mid+1,r);
	update(id);
}
void add(int id,int l,int r,int pos,int data)
{
	if (l==r)
	{
		s[id].s+=data;
		return ;
	}
	int mid=(l+r)>>1;
	if (id<=mid) add(s[id].ls,l,mid,pos,data);
	else add(s[id].rs,mid+1,r,pos,data);
	update(id);
}
int calc(int id,int l,int r,int ll,int rr)
{
	int mid=(l+r)>>1;
	if (l>rr||r<ll) return 0;
	else if (l>=ll&&r<=rr) return s[id].s;
	else return calc(s[id].ls,l,mid,ll,rr)+calc(s[id].rs,mid+1,r,ll,rr);
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for (int i=1;i<=n;i++) cin>>a[i];
	build(++nd,1,n);
	while (m--)
	{
		int op,x,y;
		cin>>op>>x>>y;
		if (op==1)
		{
			add(1,1,n,x,y);
		}
		else
		{
			cout<<calc(1,1,n,x,y)<<'\n';
		}
	}
	return 0;
}
2023/10/28 16:07
加载中...