Cod sursa(job #2289538)

Utilizator max945Maxim C max945 Data 24 noiembrie 2018 19:18:46
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

int n, m, p, q;
int a[15000];
int tree[100005];

void build(int node, int l, int r) {
    if (l==r) {tree[node]=a[l];}
    else {
        int mid=(l+r)/2;
        build(2*node, l, mid);
        build(2*node+1, mid+1, r);
        tree[node]=tree[2*node]+tree[2*node+1];
    }
	
}

void update(int nodeIndex, int start, int end, int idx) {
    if (start == end) {
        tree[nodeIndex] += a[start];
    } else {
        int mid = (start + end) / 2;
        if (start <= idx and idx <= mid) {
            update(2*nodeIndex, start, mid, idx);
        } else {
            update(2*nodeIndex + 1, mid + 1, end, idx);
        }
        tree[nodeIndex] = tree[2*nodeIndex] + tree[2*nodeIndex + 1];
    }
}

int query(int nodeIndex, int start, int end) {
    if (q < start or end < p) {
        return 0;
    }
    if (p <= start and end <= q) {
        return tree[nodeIndex];
    }
    int mid = (start + end) / 2;
    return (query(2*nodeIndex, start, mid) + query(2*nodeIndex + 1, mid + 1, end));
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> a[i];
    }
     build(1,1,n);

    int cod;
    for (int i = 1; i <= m; i++) {
        fin >> cod;
        if (cod) {
            fin >> p >> q;
            fout << query(1, 1, n) << endl;
        } else {
            int t, v;
            fin >> t >> v;
            a[t] = -v;
            update(1, 1, n, t);
        }
    }
    return 0;
}