【題目描述】:
如題,已知有n個元素組成的數列(下標從1開始計數),你需要進行下面兩種操作:
1.將某乙個數加上x
2.求出某區間每乙個數的和
【輸入描述】:
第一行包含兩個整數n、m,分別表示該數列數字的個數和操作的總個數。
第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。
接下來m行每行包含3個整數,表示乙個操作,具體如下:
操作1: 格式:1 x k 含義:將第x個數加上k
操作2: 格式:2 x y 含義:輸出區間[x,y]內每個數的和
【輸出描述】:
輸出包含若干行整數,即為所有操作2的結果。(輸出不超過int型別)
【樣例輸入】:
5 51 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4
【樣例輸出】:
1416
【時間限制、資料範圍及描述】:
對於30%的資料:n<=8,m<=10
對於70%的資料:n<=10000,m<=10000
對於100%的資料:n<=100000,m<=100000
本題是樹狀陣列模板題,樹狀陣列其實就是乙個字首和,且支援修改元素。
code:
#include#include#include#include#include#include#includeusing namespace std;
int n,m,i,num[500005],t[500005],l,r,h;
int lowbit(int x)
void tree(int x,int p)
return;
}int sum(int k)
return ans;
}int main()
for(i=1;i<=m;i++)
else
}return 0;
}
樹狀陣列1 樹狀陣列入門
仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...
UOJ 291 ZJOI2017 樹狀陣列
二維數點 首先推一推性質大概可以發現這是單點修改,求字尾和 其實也可以理解為區間 字首 修改,單點查詢 然後再簡單推一推就可以知道如果i被修改了a i 次,總共修改了sum次 如果l 1,算錯的情況就是sum a r 1 否則就是a l 1 a r 1 然後如果只是單點查詢,我們就可以直接線段樹 但...
模板 樹狀陣列1
這篇是樹狀陣列模板1 主要內容有 1.將某數加上x 2.求某區間和 也就是說支援單點修改 關於樹狀陣列的部落格講解 見基本介紹 include include include using namespace std define in read typedef long long ll const ...