Cod sursa(job #1847261)

Utilizator dan89Stan Alexandru dan89 Data 14 ianuarie 2017 14:11:24
Problema Datorii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include "stdio.h"
#define in "datorii.in"
#define out "datorii.out"

struct tree {
    tree *left;
    tree *right;
    int st;
    int dr;
    int datorie;
};

tree* updateTree(tree *node, int left, int right, int pos, int value) {
    if (node == NULL) {
        node = new tree;
        node->left = NULL;
        node->right = NULL;
        node->st = left;
        node->dr = right;
        node->datorie = 0;
    }

    if (left==right) {
        node->datorie += value;
        return node;
    }

    int mid = (node->st+node->dr)/2;

    if (pos<=mid) {
        node->left = updateTree(node->left, node->st, mid, pos, value);
    } else {
        node->right = updateTree(node->right, mid+1, node->dr, pos, value);
    }

    int left_value = (node->left == NULL) ? 0:node->left->datorie;
    int right_value = (node->right == NULL) ? 0:node->right->datorie;

    node->datorie = left_value + right_value;

    return node;
}

int queryTree(tree *node, int start, int finish) {
    if (start<=node->st && node->dr <= finish) {
        return node->datorie;
    }

    int mid = (node->st+node->dr)/2;

    int datorie = 0;

    if (start <= mid) {
        datorie += queryTree(node->left, start, finish);
    }

    if (mid < finish) {
        datorie += queryTree(node->right, start, finish);
    }
    return datorie;
}

int main() {
    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
    int N,M;

    scanf("%d%d", &N, &M);

    tree *root = NULL;

    int X;
    for (int i=1; i<=N; i++) {
        scanf("%d", &X);
        root = updateTree(root, 1, N, i, X);
    }

    int o,a,b;

    for (int i=1; i<=M; i++) {
        scanf("%d%d%d", &o, &a, &b);

        if (!o) {
            updateTree(root, 1, N, a, -b);
        } else {
            printf("%d\n", queryTree(root, a, b));
        }
    }


    return 0;
}