Cod sursa(job #2107542)

Utilizator karakter98Irimia Robert karakter98 Data 17 ianuarie 2018 15:13:10
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>
#include <algorithm>
using namespace std;

FILE* fin;
FILE* fout;

struct nod
{
    int Min;
    int Max;
    int value;
    nod *st;
    nod *dr;
} *vf;

nod* createTree(int Min, int Max)
{
    if(Min < Max)
    {
        int mij = (Min + Max) / 2;
        nod *q = new nod;
        q->Max = Max;
        q->Min = Min;
        q->value = 0;
        q->st = createTree(Min, mij);
        q->dr = createTree(mij + 1, Max);
        return q;
    }
    if(Min == Max)
    {
        nod *q = new nod;
        q->Max = Max;
        q->Min = Min;
        q->value = 0;
        q->st = nullptr;
        q->dr = nullptr;
        return q;
    }
    return nullptr;
}

int queryTree(nod *q, int left, int right, int Min, int Max)
{
    if(left > Max || right < Min)
        return 0;
    if(left >= Min && right <= Max)
        return q->value;
    int mid = (left + right) / 2;
    return queryTree(q->st, q->Min, mid, Min, Max) + queryTree(q->dr, mid + 1, q->Max, Min, Max);
}

void update(nod* q, int x, int pos)
{
    if(q->Min == pos && q->Max == pos)
        q->value += x;
    else if(q->Min > pos || q->Max < pos)
        return;
    else{
        update(q->st, x, pos);
        update(q->dr, x, pos);
        q->value = q->st->value + q->dr->value;
    }
}

int main()
{
    fin = fopen("datorii.in", "r");
    fout = fopen("datorii.out", "w");

    int n, m;

    fscanf(fin, "%d%d", &n, &m);

    vf = createTree(1, n);
    for(int i = 0; i < n; ++i)
    {
        int aux;
        fscanf(fin, "%d", &aux);
        update(vf, aux, i + 1);
    }

    int op, a, b;
    for(int i = 0; i < m; ++i)
    {
        fscanf(fin, "%d%d%d", &op, &a, &b);
        if(!op)
        {
            update(vf, -b, a);
        }
        else
            fprintf(fout, "%d\n", queryTree(vf, 1, n, a, b));
    }

    return 0;
}