1. 程式人生 > 實用技巧 >某中學校園網路建設過程中虛擬化的實施(一)

某中學校園網路建設過程中虛擬化的實施(一)

樹狀陣列的特點:

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時,對應的子數列

[a,b][a,b]的連續和。

資料範圍

1n1000001≤n≤100000,
1m1000001≤m≤100000,
1abn1≤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;
}