Cod sursa(job #1298245)

Utilizator japjappedulapPotra Vlad japjappedulap Data 22 decembrie 2014 17:53:30
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
using namespace std;

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

int N, M, best;
int arb[400004];

void Update(int N, int L, int R, int pos, int val);
void Query(int N, int L, int R, int iL, int iR);

int main()
{
    is >> N >> M;
    for (int i = 1, val; i <= N; ++i)
    {
        is >> val;
        Update(1, 1, N, i, val);
    }
    for (int i = 1, Op, x, y; i <= M; ++i)
    {
        is >> Op >> x >> y;
        if (Op == 0)
        {
            best = -1;
            Query(1, 1, N, x, y);
            os << best << '\n';
        }
        else
            Update(1, 1, N, x, y);
    }
    is.close();
    os.close();
}

void Query(int N, int L, int R, int iL, int iR)
{
    if (iL <= L && R <= iR)
        best = max(best, arb[N]);
    else
    {
        int M = (L+R)/2;
        if (iL <= M) Query(2*N, L, M, iL, iR);
        if (M < iR) Query(2*N+1, M+1, R, iL, iR);
    }
};

void Update(int N, int L, int R, int pos, int val)
{
    if (L == R)
        arb[N] = val;
    else
    {
        int M = (L+R)/2;
        if (pos <= M) Update(2*N, L, M, pos, val);
        else Update(2*N+1, M+1, R, pos, val);
        arb[N] = max(arb[2*N], arb[2*N+1]);
    }
};