线段树求调
查看原帖
线段树求调
346662
yezihao1楼主2022/4/5 21:36
#include<bits/stdc++.h>
#define maxn 10005

using namespace std;
const int mod=1e9+7;

inline int read()
{
    register int  x=0,f=0;register char ch=getchar();
    while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    return f?-x:x;
}
int sum[maxn<<2];
int a[maxn];
void pushup(const int u)//求和 
{
	sum[u]=sum[u*2]+sum[u*2+1];
}
void build(const int now,int l,int r)//建树 
{
	if(l==r)
	{
		sum[now]=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	pushup(now);
}
/*单点修改*/void ChangeOnePoint(int now,int l,int r,int p,int x)
{
	if(l==r)
	{
		sum[now]=sum[now]+x;
	}
	else
	{
		int mid=l+r>>1;
		if(mid>=p)
		{
			ChangeOnePoint(now*2,l,mid,p,x);
		}
		else ChangeOnePoint(now*2+1,mid+1,r,p,x);
		pushup(now);
	}
 } 
/*判断是否包含*/bool InRange(int L,int R,int l,int r)
{
	return (L<=l)&&(r<=R);
}
/*判断完全无交*/bool OutRange(int L,int R,int l,int r)
{
	return (L>r) || (R<l);
}
/*区间查询*/int SearchForRange(int now,int L,int R,int l,int r)
{
	if(InRange(L,R,l,r)==1)
	{
		return sum[now];
	}
	else if(OutRange(L,R,l,r)==0)
	{
		int mid=L+R>>1;
		return SearchForRange(now*2,L,mid,l,r)+SearchForRange(now*2+1,mid+1,R,l,r);
	 } 
	 else return 0;
}

int main()
{
	int n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	 } 
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op=read();
		int x=read(),y=read();
		if(op==1)
		{
			ChangeOnePoint(1,1,n,x,y); 
		}
		else 
		{
			cout<<SearchForRange(1,1,n,x,y)<<endl;
		}
	}

	return 0;
	}

2022/4/5 21:36
加载中...