Cod sursa(job #957538)

Utilizator mihai_r2005Richard Mihai Andrei mihai_r2005 Data 5 iunie 2013 12:35:05
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <fstream>

using namespace std;

typedef struct _Nod{
    struct _Nod *left;
    struct _Nod *right;
    int sum;
} Nod;

Nod* root;
int n, m;

void addValue(int val, int ind, int min, int max, Nod* curr);
int sumInInterval(int imin, int imax, int wmin, int wmax, Nod *curr);

int main()
{
    ifstream fin("datorii.in");
    ofstream fout("datorii.out");
   
    root = new Nod;
    root->left = NULL;
    root->right = NULL;
    root->sum = 0;
    
    fin >> n;
    fin >> m;
    
    for(int i = 1; i <= n; i++) {
        int t;
        fin >> t;
        addValue(t, i, 1, n, root);
    }
    for(int i = 1; i <= m; i++) {
        int op;
        fin >> op;
        if(op == 1) {
            int p, q;
            fin >> p;
            fin >> q;
            fout << sumInInterval(p, q, 1, n, root) << endl;
            
        } else {
            int t, v;
            fin >> t;
            fin >> v;
            addValue(-v, t, 1, n, root);
        }
    }
    return 0;
}

void addValue(int val, int ind, int min, int max, Nod* curr)
{
    curr->sum += val;
    if (min == max)
        return;
    
    if (ind <= (max+min)/2) {
        if (NULL == curr->left) {
            curr->left = new Nod;
            curr->left->sum = 0;
            curr->left->left = NULL;
            curr->left->right = NULL;
        }
        addValue(val, ind, min, (max+min)/2, curr->left);
    } else {
        if (NULL == curr->right) {
            curr->right = new Nod;
            curr->right->sum = 0;
            curr->right->left = NULL;
            curr->right->right = NULL;
        }
        addValue(val, ind, (max+min)/2+1, max, curr->right);
    }
}

int sumInInterval(int imin, int imax, int wmin, int wmax, Nod *curr)
{
    if (imin == wmin && imax == wmax)
        return curr->sum;
    
    if (imin <= (wmax+wmin)/2) {
        if (imax <= (wmax+wmin)/2) {
            return sumInInterval(imin, imax, wmin, (wmax+wmin)/2, curr->left);
        } else {
            int l, r;
            l = sumInInterval(imin, (wmax+wmin)/2, wmin, (wmax+wmin)/2, curr->left);
            r = sumInInterval((wmax+wmin)/2+1, imax, (wmax+wmin)/2+1, wmax, curr->right);
            return l+r;
        }
    } else {
        return sumInInterval(imin, imax, (wmax+wmin)/2+1, wmax, curr->right);
    }
}