Cod sursa(job #1377497)

Utilizator andreismara97Smarandoiu Andrei andreismara97 Data 5 martie 2015 22:13:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

#define Nmax 100001

int MaxArb[Nmax*4 + 66];
int N, q;
int poz, val;
int Start, Finish;
int maxim;

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

int main ()
{
    int x, y, cod;

    in >> N >> q;
    for(int i=1; i<=N; i++)
    {
        in >> x;
        poz = i; val = x;
        Update(1, 1, N);
    }

    for(int i=1; i<=q; i++)
    {
        in>>cod>>x>>y;
        if(cod == 0)
        {
            maxim = -1;
            Start = x; Finish = y;
            Query(1, 1, N);

            out<<maxim<<'\n';
        }
        else
        {
            poz = x; val = y;
            Update(1, 1, N);
        }
    }
}

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


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

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

void Query(int nod, int left, int right)
{
    if(Start <= left && right <= Finish)
    {
        if(maxim < MaxArb[nod])
            maxim = MaxArb[nod];
        return;
    }

    int mijl = (left+right)/2;
    if(Start <= mijl)     Query(nod*2, left, mijl);
    if(mijl  < Finish)   Query(nod*2+1, mijl+1, right);
}