洛谷 P3368 树状数组2

#include <stdlib.h>
#include <cstdio>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <math.h>
#include <algorithm>

#define mem(t, v)   memset ((t) , v, sizeof(t))
#define INF 0x3f3f3f3f

using namespace std;

const int MAX=500050;
int in[MAX];
int n,m,a,x,y,k;
int ans;
struct node{
    int l,r,num;
}tree[MAX*4];

void Build(int i,int l,int r){    //建立线段树
    tree[i].l=l,tree[i].r=r,tree[i].num=0;
    if(tree[i].l==tree[i].r){
        return ;
    }
    int mid=(l+r)>>1;
    Build(i*2,l,mid);
    Build(i*2+1,mid+1,r);
}

void pls(int i,int l,int r,int k){   //区间修改
    //printf("%d %d %d %d+++++\n",i,tree[i].l,tree[i].r,tree[i].num);
    if(tree[i].l>=l&&tree[i].r<=r){
        tree[i].num+=k;
        //printf("%d %d %d---\n",i,tree[i].num,k);
        return ;
    }
    if(tree[i*2].r>=l)pls(i*2,l,r,k);
    if(tree[i*2+1].l<=r)pls(i*2+1,l,r,k);
}

void Search(int dis,int i){   //单点查找
    ans+=tree[i].num;
    if(tree[i].r==tree[i].l){
        return ;
    }
    if(dis<=tree[i*2].r)Search(dis,i*2);
    if(dis>=tree[2*i+1].l)Search(dis,i*2+1);
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&in[i]);
    }

    Build(1,1,n);

    while(m--){
        ans=0;
        scanf("%d",&a);
        if(a==1){
            scanf("%d%d%d",&x,&y,&k);
            pls(1,x,y,k);
        }
        else {
            scanf("%d",&x);
            Search(x,1);
            printf("%d\n",ans+in[x]);
        }
    }
}
发布了62 篇原创文章 · 获赞 7 · 访问量 1640

猜你喜欢

转载自blog.csdn.net/qq_43331910/article/details/100861616