Cod sursa(job #1956318)

Utilizator GeorgianBaditaBadita Marin-Georgian GeorgianBadita Data 6 aprilie 2017 17:32:37
Problema Datorii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#define NMAX 15001
#define max(a, b) a >= b ? a : b
using namespace std;
int T[4 * NMAX + 66];
int N, M, poz, val;

FILE *f = freopen("datorii.in", "r", stdin);
FILE *g = freopen("datorii.out", "w", stdout);
void update(int node, int left, int right, int poz, int val) {
    if(left == right) {
        T[node] -= val;
        return ;
    }
    int m = (left + right) / 2;
    if(m >= poz)
        update(2 * node, left, m, poz, val);
    else update(2 * node + 1, m + 1, right, poz, val);
    T[node] = T[2*node] + T[2*node + 1];
}

int query(int node, int left, int right, int x, int y) {
    int s1 = 0, s2 = 0;
    int m = (left + right) / 2;
   if(left >= x && right <= y) {
    return(T[node]);
   }
   if(m >= x) s1 = query(2 * node, left, m, x, y);
   if(m < y) s2 = query(2 * node + 1, m + 1, right, x, y);
   return (s1 + s2);
}
int main() {
    int x;
    scanf("%d%d", &N, &M);
    for(int i = 1; i<=N; i++) {
        scanf("%d", &x);
        update(1, 1, N, i, -x);
    }
    for(int i = 1; i<=M; i++) {
        int type, poz, x, y;
        scanf("%d", &type);
        if(type == 0) {

            scanf("%d%d", &poz, &x);
            update(1, 1, N, poz, x);
        }
        else {
            scanf("%d%d", &x, &y);
            printf("%d\n", query(1, 1, N, x, y));
        }
    }
    return 0;
}