Cod sursa(job #2407005)

Utilizator minculescualex9Minculescu Alex minculescualex9 Data 16 aprilie 2019 13:19:20
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>

using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

#define Maxim(a, b) ((a > b)? a : b)
#define nMax 100005

int N, M;
int Arb[4 * nMax + 66];
int start, finish, Val, Pos, maxim;

void Update(int, int, int);
void Query(int, int, int);

int main(){

    fin >> N >> M;
    //Citire si creare arbore
    for(int i = 1; i <= N; ++i){
        int x;
        fin >> x;

        Pos = i;
        Val = x;

        Update(1, 1, N);
    }



    for(int i = 1; i <= M; ++i){
        int x, A, B;
        fin >> x >> A >> B;

        if(x == 0){             //Determina maximul din intervalul [A, B]
            maxim = -1;         //      (maximul dintre valorile Ai cu a ≤ i ≤ b).
            start = A;
            finish = B;

            Query(1, 1, N);

            fout << maxim << "\n";
        }
        else if(x == 1){        //Valoarea elementului de pe pozita a va deveni b.
            Pos = A;
            Val = B;
            Update(1, 1, N);
        }
    }

    fin.close();
    fout.close();
    return 0;
}

/*
 * Functia Update() are rolul de a contrui arborele de intervale si sa-l actualizeze.
 */
void Update(int nod, int left, int right){
    if(left == right){
        Arb[nod] = Val;
        return;
    }

    int mijloc = (left+right) / 2;

    if(Pos <= mijloc)
            Update(2*nod, left, mijloc);
    else
            Update(2*nod+1, mijloc+1, right);

    Arb[nod] = Maxim(Arb[2*nod], Arb[2*nod+1]);
}

/*
 * Functia Query() are rolul de a determina lungimea maxima din intervalul [start, finish].
 */

void Query(int nod, int left, int right){
    if(start <= left  && right <= finish){
        maxim = Maxim(maxim, Arb[nod]);
        return;
    }

    int mijloc = (left+right) / 2;

    if(start <= mijloc)
            Query(2*nod, left, mijloc);
    if(finish > mijloc)
            Query(2*nod+1, mijloc+1, right);
}