洛谷P3374(线段树)(询问区间和,支持单点修改)
2024-08-31 10:38:30
//询问区间和,支持单点修改
#include <cstdio> using namespace std; const int maxn=; struct treetype
{
int l,r,sum;
}; treetype a[*maxn];
int num[maxn]; void build(int k,int l,int r)
{
a[k].l=l;a[k].r=r;
if (l==r)
{
a[k].sum=num[l];
return;
}
int mid=(l+r)>>,i=k<<;
build(i,l,mid);
build(i+,mid+,r);
a[k].sum=a[i].sum+a[i+].sum;
}
void change(int k,int x,int t)
{
if (a[k].l==a[k].r)
{
a[k].sum+=t;
return;
}
int mid=(a[k].l+a[k].r)>>,i=k<<;
if (x<=mid) change(i,x,t);
else change(i+,x,t);
a[k].sum=a[i].sum+a[i+].sum;
}
int query(int k,int x,int y)
{
if (x<=a[k].l && a[k].r<=y) return a[k].sum;
int mid=(a[k].l+a[k].r)>>,ans=,i=k<<;
if (x<=mid) ans=query(i,x,y);
if (mid<y) ans+=query(i+,x,y);
return ans;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) scanf("%d",&num[i]);
build(,,n);
//for (int i=1;i<=n*2;i++) printf("%d %d %d %d\n",i,a[i].l,a[i].r,a[i].sum);
for (int i=;i<=m;i++)
{
int t,x,y;
scanf("%d%d%d",&t,&x,&y);
if (t==) change(,x,y);
else printf("%d\n",query(,x,y));
}
return ;
}
最新文章
- Unity3D 5.x 简单实例 - 脚本编写
- js 默认选中分页条件项
- 快乐的JS正则表达式(三)
- Java基础之集合框架——使用堆栈Stack<;>;对象模拟发牌(TryDeal)
- python3 nonlocal vs global
- Windows 7系统安装MySQL5.5.21图解
- php中 $$str 中 ";$$"; 的解释
- HDU 5650 so easy
- 初探XRebel
- [Swift]LeetCode290. 单词模式 | Word Pattern
- 从HTTL模板引擎看软件设计原则
- 从输入URL按下回车到页面展现,中间发生了什么?
- 记录一次Service被注入mapper实例的错误
- svn 使用教程
- django-restful风格
- 3d tech
- Codeforces Round #222 (Div. 1) D. Developing Game 扫描线
- centos下安装ipython(minglnghang命令行)
- HandyJSON代码阅读
- 记录个人数组、字符串自己常忘记的方法,以及ES常用处理方式