线段树板子求调
  • 板块题目总版
  • 楼主DERMING
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/8/17 15:18
  • 上次更新2023/11/3 03:08:46
查看原帖
线段树板子求调
379271
DERMING楼主2023/8/17 15:18

Link

#include<bits/stdc++.h>
using namespace std;
long long tree[500010*4];
long long a[500010];
void up(int root)
{
	tree[root]=tree[root*2]+tree[root*2+1];
	return;
}
void build(int root,int l,int r)
{
	if(l==r)
	{
		tree[root]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(root*2,l,mid);
	build(root*2+1,mid+1,r);
	up(root);
}
void update(int root,int l,int r,int x,int y)
{
	if(l==r)
	{
		tree[root]=y;
		return;
	}
	int mid=l+r>>1;
	if(x<=mid)
	{
		update(root*2,l,mid,x,y);
	}
	else if(x>mid)
	{
		update(root*2+1,mid+1,r,x,y);
	}
	up(root);
}
long long query(int root,int l,int r,int x,int y)
{
	if(x<=l&&y>=r)
	{
		return tree[root];
	}
	long long ans=0;
	int mid=l+r>>1;
	if(x<=mid)
	{
		ans+=query(root*2,l,mid,x,y);
	}
	if(y>mid)
	{
		ans+=query(root*2+1,mid+1,r,x,y);
	}
	return ans;
}
int main()
{
	int n,m;
	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 op;
		cin>>op;
		int x,y;
		cin>>x>>y;
		if(op==1)
		{
			update(1,1,n,x,y);
		}
		else
		{
			cout<<query(1,1,n,x,y)<<'\n';
		}
	}
 	return 0;
}

2023/8/17 15:18
加载中...