单点修改区间求和线段树模板


#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#define maxn 500010

using namespace std;

struct point
{
    int l,r,val;
}tr[maxn*4];

int m,n;
int a[maxn];

void buildtree(int x,int l,int r)
{
    tr[x].l=l;
    tr[x].r=r;
    if(l==r)
    {
        tr[x].val=a[l];
        return;
    }
    int lch=x*2,rch=x*2+1;
    int mid=(l+r)/2;
    buildtree(lch, l, mid);
    buildtree(rch, mid+1, r);
    tr[x].val=tr[x*2].val+tr[x*2+1].val;
}

void modify(int x,int pos,int val)
{
    if(tr[x].l==tr[x].r)
    {
        tr[x].val+=val;
        return;
    }
    int mid=(tr[x].l+tr[x].r)/2;
    if(pos<=mid)
        modify(x*2, pos, val);
    else
        modify(x*2+1, pos, val);
    tr[x].val=tr[x*2].val+tr[x*2+1].val;
}

int query(int x,int l,int r)
{
    if(l<=tr[x].l && tr[x].r<=r)
        return tr[x].val;
    int mid=(tr[x].l+tr[x].r)/2;
    int ans=0;
    if(l<=mid)
        ans+=query(x*2, l, r);
    if(r>mid)
        ans+=query(x*2+1, l, r);
    return ans;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    buildtree(1, 1, n);
    for(int i=1;i<=m;i++)
    {
        int op;
        scanf("%d",&op);
        if(op==1)
        {
            int x,k;
            scanf("%d%d",&x,&k);
            modify(1, x, k);
        }
        else
        {
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%d\n",query(1, x, y));
        }
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 17:37
点赞 评论 收藏
分享
05-11 20:45
门头沟学院 Java
有担当的灰太狼又在摸...:零帧起手查看图片
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务