树状数组

こ雲淡風輕ζ 提交于 2019-11-30 03:32:39
#include <iostream>
#include <cstdio>

using namespace std;

const int maxn=5e5+10;

long long a[maxn],c[maxn];

inline int lowbit(int x)
{
    return x&(-x);
}

void build(int n)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j+=lowbit(j))
            c[j]+=a[i];
    }
    return ;
}

void update(int x,int k,int n)
{
    for(;x<=n;x+=lowbit(x))c[x]+=k;
}

long long query(int x)
{
    long long ans=0;
    while(x)
    {
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    build(n);
    int op,x,y;
    while(m--)
    {
        scanf("%d %d %d",&op,&x,&y);
        if(op==1)
        {
            update(x,y,n);
        }
        else
        {
            if(x>y)
                swap(x,y);
            printf("%lld\n",query(y)-query(x-1));
        }
    }
    return 0;
}
单点修改
#include <iostream>
#include <cstdio>

using namespace std;

const int maxn=5e5+10;

long long a[maxn],c[maxn],b[maxn];

inline int lowbit(int x)
{
    return x&(-x);
}

void build(int n)
{
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j+=lowbit(j))
            c[j]+=a[i];
    }
    return ;
}

void update(int x,int k,int n)
{
    for(;x<=n;x+=lowbit(x))c[x]+=k;
}

long long query(int x)
{
    long long ans=0;
    while(x)
    {
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&b[i]);
        a[i]=b[i]-b[i-1];
    }
    build(n);
    int op,x,y,k;
    while(m--)
    {
        scanf("%d %d",&op,&x);
        if(op==1)
        {
            scanf("%d %d",&y,&k);
            update(x,k,n);
            update(y+1,-k,n);
        }
        else
        {
            printf("%lld\n",query(x));
        }
    }
    return 0;
}
区间修改,单点查询

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!