树状数组改点求段

#include<stdio.h>

int a[20],n;

int lowbit(int x)

{

    return x&(-x);

}



void add(int x,int c)

{

    int i;

    for(i=x; i<=n; i+=lowbit(i))a[i]+=c;

}

int sum(int x)

{

    int s=0,i;

    for(i=x; i; i-=lowbit(i))s+=a[i];

    return s;

}

int main()

{

    scanf("%d",&n);

    add(10,2);//把a[10]加2

printf("%d",sum(n));//输入10则a[1]到a[10]的和为2(a初始全为0)



    return 0;

}

上面是最基本的改点求段
add 使a[x]加c

sum 求 1...x 的和
●注意 x 不能是 0

例2

#include<stdio.h>

int a[50],n;

int lowbit(int x)

{

    return x&(-x);

}



void add(int x,int c)

{

    int i;

    for(i=x; i<=n; i+=lowbit(i))a[i]+=c;

}

int sum(int x)

{

    int s=0,i;

    for(i=x; i; i-=lowbit(i))s+=a[i];

    return s;

}

int main()

{

int i;

      scanf("%d",&n);

for(i=1;i<=20;i++)add(i,i);//给a[i]赋值i

printf("%d",sum(n));//求a[1]到a[n]的和

    return 0;

}

你可能感兴趣的:(树状数组)