Cod sursa(job #2312771)

Utilizator cameliapatileaPatilea Catalina Camelia cameliapatilea Data 5 ianuarie 2019 15:01:24
Problema Arbori de intervale Scor 40
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.62 kb
#include <stdio.h>

int v[500000], arbore[100000];
int stanga, dreapta, poz;
void construire_arbore(int st, int dr, int pozitie)
{
    if (st ==  dr)
         arbore[pozitie] = v[st];
    else{
       int mijloc = (st + dr) / 2;
        //adaug fiul stang
        construire_arbore(st, mijloc, 2 * pozitie);
        //adaug fiul drept
        construire_arbore(mijloc + 1, dr, 2 * pozitie + 1);
        if(arbore[2 * pozitie] > arbore[2 * pozitie + 1])
            arbore[pozitie] = arbore[2 * pozitie];
        else arbore[pozitie] = arbore[2 * pozitie + 1];
    }
}
void restabilire_arbore(int st, int dr, int pozitie)
{
    //daca am ajuns pe cazul de baza, elementul de pe pozitia respectiva ia valoarea elementului de pe pozitia st din vectorul initial
    if(st == dr)
        arbore[pozitie] = v[st];
    else{
       int mijloc = (st + dr) / 2;
        if(poz <= mijloc)
        //ma mut in partea din stanga a subarborelui
            restabilire_arbore(st, mijloc, 2 * pozitie);
            //ma mut in partea din dreapta a subarborelui
        else restabilire_arbore(mijloc + 1, dr, 2 * pozitie + 1);
        if(arbore[2 * pozitie] > arbore[2 * pozitie + 1])
            arbore[pozitie] = arbore[2 * pozitie];
        else arbore[pozitie] = arbore[2 * pozitie + 1];
    }
}
int interogare(int st, int dr, int pozitie)
{

    //atata timp cat nu am depasit capetele
    if(stanga <= st && dr <= dreapta)
    return arbore[pozitie];
    else
    {
         int maxi_st = -9999999;
        int maxi_dr = -9999999;

        int mijloc = (st + dr) / 2;
        if(stanga <= mijloc)
            //maximul se aflsa in partea stanga a subarborelui
            maxi_st = interogare(st, mijloc, 2 * pozitie);
       if(mijloc + 1 <= dreapta)
       //maximul se afla in partea dreapta a subarborelui
        maxi_dr = interogare(mijloc + 1, dr, 2 * pozitie + 1);
    if(maxi_st > maxi_dr)
        return maxi_st;
    else return maxi_dr;
    }
}

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

    int n, m, cod, a, b;

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

    for(int i = 1; i <= n; i++)
        fscanf(f, "%d", &v[i]);

    construire_arbore(1, n, 1);

    for(int i = 1; i<= m; i++)
    {
        fscanf(f, "%d%d%d", &cod, &a, &b);
        if(cod == 0)
        {
            stanga = a;
            dreapta  = b;
            int rez = interogare(1, n, 1);
            fprintf(g, "%d\n", rez);
        }
        else
        {
            v[a] = b;
             poz = a;
            restabilire_arbore(1, n, 1);
        }
    }
    return 0;

}