如題,已知乙個數列,你需要進行下面兩種操作:
第一行包含兩個正整數 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,表示數列長度和詢...