Cod sursa(job #2158057)

Utilizator cristii2000cristiiPanaite Cristian cristii2000cristii Data 10 martie 2018 10:06:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

const int MAXN = 100041;

int n, m;
int sir[MAXN], arbint[4 * MAXN];

void citire()
{
    in >> n >> m;
    for(int i = 1; i <= n; i++)
        in >> sir[i];
}

void constructie(int st, int dr, int nod = 1)
{
    if(st == dr)
    {
        arbint[nod] = sir[st];
        return;
    }
    int mij = (st + dr) / 2;
    constructie(st, mij, nod << 1);
    constructie(mij + 1, dr, nod << 1 | 1);
    arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}

int query(int qst, int qdr, int st = 1, int dr = n, int nod = 1)
{
    if(qst <= st && dr <= qdr)
    {
        return arbint[nod];
    }
    int mij = (st + dr) >> 1;

    int maxi = -1;

    if(mij >= qst)
        maxi = max(maxi, query(qst, qdr, st, mij, nod << 1));
    if (qdr > mij)
        maxi = max(maxi, query(qst, qdr, mij+1, dr, nod<<1 | 1));
    return maxi;

}

void update(int pos, int val, int st = 1, int dr = n, int nod = 1)
{
    if (st == dr)
        arbint[nod] = val;
    else
    {
        int mij = (st+dr) >> 1;
        if (pos <= mij)
            update(pos, val, st, mij, nod<<1);
        else
            update(pos, val, mij+1, dr, nod<<1 | 1);
        arbint[nod] = max(arbint[nod<<1], arbint[nod<<1|1]);
    }
}

int main()
{
    citire();
    constructie(1, n);
//
//    for(int i = 1; i <= 9 ; i++)
//        cout << arbint[i] << " ";

    for(int i = 1; i <= m; i++)
    {
        int op, a, b;
        
        in >> op >> a >> b;
        
        if(op == 0)
        {
            out << query(a, b) << '\n';
        }
        else
        {
            update(a, b);
        }
    }
    return 0;
}