Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- int tree[400100];
- int a[100100];
- int Build(int node, int st, int en)
- {
- if(st == en){
- tree[node] = a[st];
- return tree[node];
- }
- int mid = (st + en) / 2;
- int p1 = 0, p2 = 0;
- p1 = Build(node * 2, st, mid);
- p2 = Build((node * 2) + 1, mid + 1, en);
- tree[node] = p1 + p2;
- return tree[node];
- }
- int update(int node, int st, int en, int idx, int val)
- {
- if(st == en && st == idx){
- tree[node] = val;
- return tree[node];
- }
- if(idx > en || idx < st){
- return tree[node];
- }
- int mid = (st + en) / 2;
- int p1 = 0, p2 = 0;
- p1 = update(node * 2, st, mid, idx, val);
- p2 = update((node * 2) + 1, mid + 1, en, idx, val);
- tree[node] = p1 + p2;
- return tree[node];
- }
- int Query(int node, int st, int en, int i, int j)
- {
- if(st == en && (i <= st && st <= j)){
- return tree[node];
- }
- if(i > en || j < st){
- return 0;
- }
- if(i <= st && en <= j){
- return tree[node];
- }
- int mid = (st + en) / 2;
- int p1 = 0, p2 = 0;
- p1 = Query(node * 2, st, mid, i, j);
- p2 = Query((node * 2) + 1, mid + 1, en, i, j);
- return p1 + p2;
- }
- int main()
- {
- int n, t, i, j, x, Q;
- cin >> n;
- for(int i = 1 ; i <= n ; i++){
- cin >> a[i];
- }
- Build(1, 1, n);
- cin >> Q;
- while(Q--){
- cin >> t;
- if(t == 1){
- cin >> i >> j;
- cout << Query(1, 1, n, i, j) << endl;
- }
- else{
- cin >> i >> x;
- update(1, 1, n, i, x);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement