Cod sursa(job #1643574)

Utilizator DarianCDarian Craciun DarianC Data 9 martie 2016 19:22:02
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#define nmax 100001
#define max(a,b) (a>b)?a:b
using namespace std;

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

int AINT[2*nmax+10], N, Q, maxim;

void Update(int R, int st, int dr, int POZ, int VAL)
{
    if(st==dr) {
                    AINT[R] = VAL;
                    return;
    }

    int mij = (st+dr)/2;
    if(POZ <= mij)
        Update(2*R, st, mij, POZ, VAL);
    if(POZ > mij)
        Update(2*R+1, mij+1, dr, POZ, VAL);

    AINT[R] = max(AINT[2*R], AINT[2*R+1]);
}

void citire()
{
    int X;
    fin>>N>>Q;
    for(int i=1; i<=N; i++)
    {
        fin>>X;
        Update(1, 1, N, i, X);
    }
}

void Query(int R, int st, int dr, int A, int B)
{
    if(A<=st && dr<=B) {
        maxim = max(maxim, AINT[R]); return;
    }

    int mij = (st+dr)/2;
    if(A <= mij)
        Query(2*R, st, mij, A, B);
    if(mij < B)
        Query(2*R+1, mij+1, dr, A, B);

}
int main()
{
    citire();

    int key, a, b;
    while(Q--)
    {
        fin>>key>>a>>b;
        if(key==0) {
                        Query(1, 1, N, a, b); fout << maxim <<'\n';
                        maxim = -1;
        }
        else Update(1, 1, N, a, b);
    }

    return 0;
}