單點修改 區間求和

2021-10-02 16:54:53 字數 1476 閱讀 8174

如題,已知乙個數列,你需要進行下面兩種操作:

第一行包含兩個正整數 n,mn,m,分別表示該數列數字的個數和操作的總個數。

第二行包含 nn 個用空格分隔的整數,其中第 ii 個數字表示數列第 ii 項的初始值。

接下來 mm 行每行包含 33 個整數,表示乙個操作,具體如下:

輸出包含若干行整數,即為所有操作 22 的結果。

輸入 #1

5 5

1 5 4 2 3

1 1 3

2 2 5

1 3 -1

1 4 2

2 1 4

輸出 #1

14

16

【資料範圍】

對於 30\%30% 的資料,1 \le n \le 81≤n≤8,1\le m \le 101≤m≤10;

對於 70\%70% 的資料,1\le n,m \le 10^41≤n,m≤104;

對於 100\%100% 的資料,1\le n,m \le 5\times 10^51≤n,m≤5×105。

**:

#includeusing namespace std;

#define ll long long

struct node

tree[4000000];

int input[500005];

void build(int k, int l, int r)

int mid = (l + r) >> 1;

build(2 * k, l, mid);

build(2 * k + 1, mid + 1, r);

tree[k].sum = tree[2 * k].sum + tree[2 * k + 1].sum;

}void add1(int k, int dis, int x)

int mid = (tree[k].l + tree[k].r) >> 1;

if (mid >= dis)add1(2 * k, dis, x);

else add1(2 * k + 1, dis, x);

tree[k].sum = tree[2 * k].sum + tree[2 * k + 1].sum;

}int query(int k, int l, int r)

int mid = (tree[k].l + tree[k].r) >> 1;

if (mid >= r)return query(2 * k, l, r);

else if (mid < l)return query(2 * k + 1, l, r);

else return query(2 * k, l, mid) + query(2 * k + 1, mid + 1, r);

}int main()

else

}}

樹狀陣列 單點修改區間查詢

樹狀陣列,時間複雜度o mlogn 明顯優於暴力列舉以及字首和,主要用於單點修改區間查詢 當然還有區間修改單點查詢 如果一道題中只有區間查詢,那麼建議使用字首和維護 思想直接理解不好理解,借助資料 a陣列下標12 3456 78數值2 5632 714以上是我們要儲存的a陣列,就是原資料 b陣列下標...

樹狀陣列(單點修改區間查詢)

lowbit是用來取出二進位制中最低位數的1所代表的二進位制的值。只需要記下 就行了 int lowbit int x 將乙個樹的最子節點修改,則其父節點也需要更改,父父節點也需要修改。x x lowbit x 就是用來取出其父節點的。void add int x,int k 能查詢原陣列的字首和,...

線段樹單點修改區間查詢

這是一道模板題。給定數列 a 1 a 2 a n 你需要依次進行 qq 個操作,操作有兩類 1 i x 給定 i,x,將 a i 加上 x 2 l r 給定 l,r,求 ri la i 的值 換言之,求 a l a l 1 a r 的值 input 第一行包含 2 個正整數 n,q,表示數列長度和詢...