博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codevs1080线段树练习
阅读量:5234 次
发布时间:2019-06-14

本文共 1383 字,大约阅读时间需要 4 分钟。

#include
#include
#include
#define maxn 100010#define maxm 200020#define maxx 10010using namespace std;int n,m,a[maxn],num;struct node{ int lc,rc; int l,r; int sum;}tree[maxm];void build(int ll,int rr){ int cur=++num; tree[cur].l=ll;tree[cur].r=rr; if(ll!=rr-1) { tree[cur].lc=num+1; build(ll,(ll+rr)/2); tree[cur].rc=num+1; build((ll+rr)/2,rr); tree[cur].sum=tree[tree[cur].lc].sum+tree[tree[cur].rc].sum; } else tree[cur].sum=a[ll];}void change(int k,int x,int p){ if(tree[k].l==tree[k].r-1)tree[k].sum+=p; else { if(x<(tree[k].l+tree[k].r)/2)change(tree[k].lc,x,p); if(x>=(tree[k].l+tree[k].r)/2)change(tree[k].rc,x,p); tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum; }}int find(int k,int ll,int rr){ if(ll<=tree[k].l&&rr>=tree[k].r)return tree[k].sum; int ans=0; if(ll<(tree[k].l+tree[k].r)/2)ans+=find(tree[k].lc,ll,rr); if(rr>(tree[k].l+tree[k].r)/2)ans+=find(tree[k].rc,ll,rr); return ans;}int main(){ cin>>n; int i,j,x,y,z; for(i=1;i<=n;i++) cin>>a[i]; build(1,n+1); cin>>m; for(i=1;i<=m;i++) { cin>>x>>y>>z; if(x==1)change(1,y,z); if(x==2)cout<
<

 

转载于:https://www.cnblogs.com/yanlifneg/p/5352859.html

你可能感兴趣的文章
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>