Cod sursa(job #2749082)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 4 mai 2021 21:45:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 kb

#include <iostream>
#include<fstream>
# define N 100005
#include<algorithm>
#include<iomanip>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, a[N];

struct nod
{
    int info;
    nod* urm1;
    nod* urm2;
};
nod* radacina;
//1,2,3,4,5
//1,2,3 4,5
//1,2 3 4 5
//1 2


void creare(nod* radacina, int st, int dr)
{
    if(st == dr)
    {
        radacina -> info = a[st];       ///in frunze vor fi elem vectorului
        return;
    }
    int mij = (st + dr)/2;
    radacina -> urm1 = new nod;
    radacina -> urm2 = new nod;

    creare(radacina ->urm1 , st, mij);
    creare(radacina ->urm2 , mij + 1, dr);

    radacina -> info = max(radacina -> urm1 -> info, radacina -> urm2 -> info);     ///in radacina fiecarui subarbore tinem minte maximul din intervalul respectiv
    ///in radacina va fi maximul din 1--> n)
}


int raspuns(nod* radacina, int st, int dr, int x, int y)
{
    if(x <= st && y >= dr)
        return radacina -> info;


    int mij = (st + dr) / 2;
    if(y <= mij)
        return raspuns(radacina -> urm1, st, mij, x, y);
    if(x > mij)
        return raspuns(radacina -> urm2, mij + 1, dr, x, y);

    return max(raspuns(radacina -> urm1, st, mij, x, mij), raspuns(radacina -> urm2, mij + 1, dr, mij + 1, y));

}

void schimba(nod* radacina ,int st, int dr, int x, int y)
{
    if(st == dr)
    {
        radacina -> info = a[x] = y;    ///schimbam si in frunza si in vector
        return;
    }
    int mij = (st + dr) / 2;
    if(x <= mij)    ///vedem in care subarbore trb sa schimb
        schimba(radacina -> urm1, st, mij, x, y);
    else if(x > mij)
        schimba(radacina -> urm2, mij + 1, dr, x, y);

    radacina -> info = max(radacina -> urm1 -> info, radacina -> urm2 -> info); ///actualizam maximul din radacina


}

int main()
{
    int i, x, y, task;
    fin >> n >> m;
    for(i = 1; i <= n ;++i)
        fin >> a[i];

    radacina = new nod;

    creare(radacina, 1, n);

    for(i = 1; i <= m; ++i)
    {
        fin >> task >> x >> y;
        if(task == 0)
          fout << raspuns(radacina, 1, n, x, y) << "\n";
        else
            schimba(radacina, 1, n, x, y);//din x cu val y

    }


}