Cod sursa(job #2182523)

Utilizator BazagazealOancea Eduard Bazagazeal Data 22 martie 2018 14:02:00
Problema Datorii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <stdlib.h>

int v[120001];

void update(int node, int st, int dr, int a, int b, int val) {
    if(a > dr || b < st)
        return;
    int mij = (st + dr) / 2;
    if(a <= st && b >= dr)
        v[node] += val;
    else if(node <= 60000) {
            update(node * 2, st, mij, a, b, val);
            update(node * 2 + 1, mij + 1, dr, a, b, val);
            v[node] = v[node * 2] + v[node * 2 + 1];
        }
}

int query(int node, int st, int dr, int a, int b) {
    if(a > dr || b < st)
        return 0;
    int mij = (st + dr) / 2;
    if(a <= st && b >= dr)
        return v[node];
    else if(node <= 60000)
        return (query(node * 2, 1, mij, a, b) + query(node * 2 + 1, mij + 1, dr, a, b));
}

int main()
{
    FILE *f = fopen("datorii.in", "r");
    FILE *g = fopen("datorii.out", "w");
    int n, m, x, c, y, i;
    fscanf(f, "%d%d", &n, &m);
    for(i = 1; i <= n; i++) {
        fscanf(f, "%d", &x);
        update(1, 1, n, i, i, x);
    }
    for(i = 1; i <= m; i++) {
        fscanf(f, "%d%d%d", &c, &x, &y);
        if(c)
            fprintf(g, "%d\n", query(1, 1, n, x, y));
        else update(1, 1, n, x, x, -y);
    }
    return 0;
}