首页 > 编程语言 > 详细

树状数组

时间:2021-02-15 10:18:21      阅读:24      评论:0      收藏:0      [点我收藏+]
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define maxn 500010
using namespace std;
template<typename T>
inline void read(T &x){
    x=0; bool flag=0; char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==-) flag=1;
    for(;isdigit(c);c=getchar()) x=x*10+(c^48);
    if(flag) x=-x;
}

int n,m,num,x,y,k,temp=0;
int a[maxn],b[maxn]; 

void add(int x,int y){
    for(;x<=n;x+=x&-x) b[x]+=y;//lowbit
}

int ask(int x){
    int ans=0;
    for(;x;x-=x&-x) ans+=b[x];//lowbit 
    return ans;
}

int main(){
    read(n),read(m);
    for(int i=1;i<=n;i++) {
        read(a[i]);
        add(i,a[i]-temp);
        temp=a[i];
    }
    for(int i=1;i<=m;i++){
        read(num);
        if(num==1){
            read(x),read(y),read(k);
            add(x,k);//差分思想 
            add(y+1,-k);//对区间[x,y]修改,只要修改b[x]和b[y+1]即可 
        }
        if(num==2){
            read(x);
            cout<<ask(x)<<endl;
        }
    }
    return 0;
} 

 

树状数组

原文:https://www.cnblogs.com/DReamLion/p/14402908.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!