Cod sursa(job #2547898)

Utilizator PatrascuAdrian1Patrascu Adrian Octavian PatrascuAdrian1 Data 15 februarie 2020 20:28:25
Problema Datorii Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

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

const int Nmax = 15005;
int T[4 * Nmax];
int N,M,x;

inline void build(int i, int left, int right, int x,int poz) {
    if(left == right) {
        T[i] = x;
    } else {
        int mid = (left + right) / 2;
        if(poz <= mid)
            build((i << 1),left, mid,x,poz);
        else
            build((i << 1) + 1,mid + 1, right,x,poz);
        T[i] = T[(i << 1)] + T[(i << 1) + 1];
    }
}

inline void update(int i, int left, int right, int poz, int x) {
    if(left == right) {
        T[i] -= x;
    } else {
        int mid = (left + right) / 2;
        if(poz <= mid)
            update((i << 1), left, mid, poz,x);
        else
            update((i << 1) + 1, mid + 1, right, poz,x);
        T[i] = T[(i << 1)] + T[(i << 1) + 1];
    }
}

inline int sum(int i, int left, int right, int lq, int rq) {
    if(lq > rq)
        return 0;
    if(lq == left && rq == right)
        return T[i];
    int mid = (left + right) / 2;
    return sum((i << 1), left, mid, lq, min(rq,mid)) +
           sum((i << 1) + 1, mid + 1, right, max(lq,mid + 1), rq);
}

int main() {
    ios_base::sync_with_stdio(0);
    in >> N >> M;
    for(int i = 1; i <= N; ++i) {
        int x;
        in >> x;
        build(1,1,N,x,i);
    }
    bool p;
    int x,y;
    while(M--) {
        in >> p >> x >> y;
        if(!p) {
            update(1,1,N,x,y);
        } else {
            out << sum(1,1,N,x,y) << '\n';
        }
    }
    return 0;
}