數字影象空間域 頻域
樹狀陣列的特點:
1. 可以修改某個點的值
2. 區間修改
int lowbit(int x){
return x&-x;
}
這個函式的作用主要是求x能整除2的幾次冪
給定nn個數組成的一個數列,規定有兩種操作,一是修改某個元素,二是求子數列[a,b][a,b]的連續和。
輸入格式
第一行包含兩個整數nn和mm,分別表示數的個數和操作次數。
第二行包含nn個整數,表示完整數列。
接下來mm行,每行包含三個整數k,a,bk,a,b(k=0k=0,表示求子數列[a,b][a,b]的和;k=1k=1,表示第aa個數加bb)。
數列從11開始計數。
輸出格式
輸出若干行數字,表示k=0k=0時,對應的子數列
資料範圍
1≤n≤1000001≤n≤100000,
1≤m≤1000001≤m≤100000,
1≤a≤b≤n1≤a≤b≤n
輸入樣例:
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8
輸出樣例:
11 30 35
程式碼
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int n,m;
int k,a,b;
int c[N];
int f[N];
int lowbit(int x){
return x&-x;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
for(int i=1;i<=n;i++){
for(int j=i-lowbit(i)+1;j<=i;j++)
f[i]+=c[j];
}
while(m--){
scanf("%d%d%d",&k,&a,&b);
if(k==0){
int sum=0,sum1=0;
for(int i=b;i>0;i-=lowbit(i))
sum+=f[i];
for(int i=a-1;i>0;i-=lowbit(i))
sum1+=f[i];
printf("%d\n",sum-sum1);
}else{
for(int i=a;i<=n;i+=lowbit(i))
f[i]+=b;
}
}
return 0;
}