Cod sursa(job #2214908)

Utilizator NOSCOPEPROKENDYMACHEAMACUMVREAU NOSCOPEPROKENDY Data 20 iunie 2018 15:21:39
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<bits/stdc++.h>
#define L 2*nod
#define R 2*nod|1
using namespace std;
 
int a[15010], H[35000], n,m, nr, idx, f, l, r;
 
void build(int st, int dr, int nod) {
    if (st==dr) {
        H[nod] = a[st];
        return;
    }
    int mid = st+dr >> 1;
    build(st, mid, L);
    build(mid+1, dr, R);
    H[nod] = H[L] + H[R];
}
 
void update(int st, int dr, int nod) {
    if (st==dr) {
        H[nod]-=nr;
        return;
    } 
     
    int mid = st+dr >> 1;
    if (idx <= mid) update(st, mid, L);
    else update(mid+1, dr, R);
    H[nod] = H[L] + H[R];
}
 
int query(int st, int dr, int nod) {
    if (l<=st && dr<=r) return H[nod];
     
    int mid = st+dr >> 1;
    int left = 0, right = 0;
    if (l<=mid) left = query(st, mid, 2*nod);
    if (r>mid) right = query(mid+1, dr, 2*nod+1);
     
    return left + right;
}
 
 
int main() {
    ifstream cin("datorii.in");
    ofstream cout("datorii.out");
     
    cin>>n>>m;
    for (int i=1; i<=n; i++) cin>>a[i];
    build(1,n,1); //cream arborele de intervale
     
    for (int i=0; i<m; i++) {
        cin>>f;
        if (f) {
            cin>>l>>r; //p-ru operatie de tip 1 interogam
            cout<<query(1,n,1)<<'\n';
        } else {
            cin>>idx>>nr; //p-ru operatia de tip 0 actualizam arborele
            update(1, n, 1);
        }
    }
    return 0;
}