Cod sursa(job #796629)

Utilizator Theorytheo .c Theory Data 11 octombrie 2012 22:38:07
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
#define nmax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int N, M, H[nmax * 2 + 100];
int val,poz;
int maxi;
int start, finish;
int max(int a, int b)
{
    if(a > b)
    return a;
    else
    return b;
}
void update(int nod, int st, int dr)
{
    if(st == dr)
        H[nod] = val;
    else
    {
        int m = (st + dr) / 2;
        if(poz <=m )
            update(nod * 2, st, m );
        else
            update(nod * 2+ 1, m + 1,dr);
    H[nod] = max(H[nod *2] , H[nod * 2 + 1]);
    }


}
void read()
{
    fin >>N >>M;
    for(int i = 1; i <= N; i++)
    {
        int a;
        fin >> a;
        val = a;
        poz = i ;
        update(1,1,N);

    }
}
void query(int nod, int st, int dr)
{
    if(start <= st && dr<= finish)
    {
        maxi = max(maxi, H[nod]);

    }
    else
    {
        int m = (st + dr)/2;
            if(start <= m)
            query (nod * 2, st, m);
            if(m < finish)
            query(nod * 2 + 1, m + 1, dr);

    }
}
int main()
{
    read();
    for(int i = 1; i <= M ;i++)
    {
        int type;
        fin >> type>> start >> finish;
        maxi = 0;
        if(type==0 ){
        query(1,1,N);
        fout << maxi <<'\n';
        }
        else
        {

            poz = start;
            val = finish;
            update(1,1,N);
        }
    }
    fin.close();
    return 0;
}