Cod sursa(job #2194593)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 13 aprilie 2018 20:03:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>

#define MAX 100005
using namespace std;

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

int MaxArb[4 * MAX + 66];
int val, pos, st, fs, maxx;;

class arboreDeIntervale
{
public:
    void Update(int nod, int left, int right){
        if(left == right){
            MaxArb[nod] = val;
            return;
        }

        int div = (left + right) / 2;
        if(pos <= div)
            Update(2 * nod, left, div);
        else Update(2 * nod + 1, div + 1, right);

        MaxArb[nod] = max(MaxArb[2 * nod], MaxArb[2 * nod + 1]);
    }

    void Query(int nod, int left, int right){
        if(st <= left && right <= fs){
            if(maxx < MaxArb[nod])
                maxx = MaxArb[nod];
            return;
        }

        int div = (left + right) / 2;
        if(st <= div)
            Query(2 * nod, left, div);
        if(div < fs)
            Query(2 * nod + 1, div + 1, right);
    }
};

int main()
{
    arboreDeIntervale p;

    int n, m;
    fin >> n >> m;

    for(int i = 1; i <= n; ++i){
        int x;
        fin >> x;

        pos = i;
        val = x;

        p.Update(1, 1, n);
    }

    for(int i = 1; i <= m; ++i){
        int x, a, b;
        fin >> x >> a >> b;

        if(x == 0){
            maxx = -1;
            st = a;
            fs = b;

            p.Query(1, 1, n);

            fout << maxx << '\n';
        }
        else {
            pos = a;
            val = b;

            p.Update(1, 1, n);
        }
    }
    return 0;
}