洛谷 : P3374 【模板】树状数组 1 P3368 【模板】树状数组 2

********************************************************************************

属于模板题了,一个单点修改区间询问,一个区间修改单点询问

/*单点修改的*/ 

#include<cstdio>
#include<algorithm>
#define maxn 500001
using namespace std;
int tree[maxn];
int lowbit(int x)
{
    return x&-x;
}
int n,m;
void add(int w,int x)
{
    while(w<=n)
    {
        tree[w]+=x;
        w+=lowbit(w);
    }
}
int modify(int x)
{
    int ans=0;
    while(x>0)
    {
        ans+=tree[x];
        x-=lowbit(x);
    }
    return ans;
}
int read()
{
    int now=0;
    int f=1;
    char c=getchar();
    while(c>'9'||c<'0')
    {
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        now*=10;
        now+=c-'0';
        c=getchar();
    }
    return now*f;
}

int main()
{
    n=read();
    m=read();
    for(int i=1;i<=n;i++)
    {
        add(i,read());
    }
    for(int i=1;i<=m;i++)
    {
        int pan=read();
        int op=read();
        int od=read();
        if(pan==1)
        {
            add(op,od);
        }
        else
        {
            printf("%d
",modify(od)-modify(op-1));
        }
    }
    return 0;
}

*****************************************************************

/*区间修改的*/

#include<cstdio>
#define maxn 500001
using namespace std;
int n,m;
int tree[maxn];
int note=0;
int read()
{
    int now=0;
    int f=1;
    char c=getchar();
    while(c>'9'||c<'0')
    {
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        now*=10;
        now+=c-'0';
        c=getchar();
    }
    return now*f;
}
int lowbit(int x)
{
    return x&-x;
}
void add(int wei,int x)
{
    while(wei<=n)
    {
        tree[wei]+=x;
        wei+=lowbit(wei); 
    }
}
int query(int x)
{
    int ans=0;
    while(x>0)
    {
        ans+=tree[x];
        x-=lowbit(x);
    }
    return ans;
}
int main()
{
    n=read();
    m=read();
    int a,b,c;
    for(int i=1;i<=n;i++)
    {
        int aa=read();
        add(i,aa-note);
        note=aa;
    }
    for(int i=1;i<=m;i++)
    {
        
        if(read()==1)
        {
            a=read(),b=read(),c=read(),add(a,c),add(b+1,-c);
        }
        else
            printf("%d
",query(read()));
    }
    return 0;
 } 
原文地址:https://www.cnblogs.com/luoyibujue/p/6890028.html