首页 > 代码库 > 树状数组
树状数组
#include<iostream> using namespace std; int n,m,i,num[100001],t[200001],l,r;//num:原数组;t:树状数组 int lowbit(int x) { return x&(-x); //右起第一个1的位置为第k个 返回值则为2^(k-1) } void update(int x,int p)//更新第x 的值 { while(x<=n) { t[x]+=p; x+=lowbit(x);//不断找到自己的祖先 更新值 } return; } int sum(int k)//前k个数的和 { int ans=0; while(k>0) { ans+=t[k]; k-=lowbit(k); } return ans; } int ask(int l,int r)//求l-r区间和 { return sum(r)-sum(l-1); } int main() { cin>>n>>m; for(i=1;i<=n;i++) { cin>>num[i]; update(i,num[i]); } for(i=1;i<=m;i++) { cin>>l>>r; cout<<ask(l,r)<<endl; } return 0; }
树状数组
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。