Cod sursa(job #2312841)

Utilizator cameliapatileaPatilea Catalina Camelia cameliapatilea Data 5 ianuarie 2019 16:45:21
Problema Datorii Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<stdio.h>
int n, m, a, poz, elem, suma, stanga, dreapta, elem;
int arbore[15005];
void restabilire_arbore(int st, int dr, int pozitie)
{

    arbore[pozitie] = arbore[pozitie] + elem;
    if(st==dr) return;

        int mijloc = (st + dr) / 2;
        if(poz <= mijloc)
            //daca pozitia elementului cautat e mai mica decat mijlocul
            //restabilesc partea stanga a subarborelui
            restabilire_arbore(st, mijloc, 2 * pozitie);
        //altfel restabilesc partea dreapta a subarborelui
        else restabilire_arbore(mijloc + 1, dr, 2 * pozitie + 1);


}
void interogare(int st, int dr, int pozitie)
{
//cat timp nu am depasit capetele
    if(stanga<= st && dr <= dreapta)
        {
            //calculez suma pe intervalul cerut
            suma = suma + arbore[pozitie];
            return;
        }
        //altfel ma mut in subarborele drept , respectiv stang pentru care calculez ulterior suma
        int mijloc  = (st + dr) / 2;
        if(stanga <= mijloc)
            interogare(st, mijloc, 2 * pozitie);
        if(dreapta > mijloc)
            interogare(mijloc + 1, dr, 2 * pozitie + 1);

}
int main()
{
    FILE *f = fopen("datorii.in", "r+");
    FILE *g = fopen("datorii.out", "w+");

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

    for(int i = 1; i<= n; i++)
    {
        fscanf(f, "%d", &a);
        poz = i;
        elem = a;
        restabilire_arbore(1, n, 1);
    }
    int cod, x, y;
    for(int i = 1; i <= m; i++)
    {
        fscanf(f, "%d%d%d", &cod, &x, &y);
        if(cod == 0)
        {
            poz = x;
            //scad din valoarea initiala suma de bani care a fost restituita
            elem = (-1) * y;
            restabilire_arbore(1, n, 1);
        }
        else
        {
            suma = 0;
            stanga = x;
            dreapta = y;
            interogare(1, n, 1);
            fprintf(g, "%d\n", suma);
        }
    }
    return 0;
}