Cod sursa(job #1128325)

Utilizator vladstoickvladstoick vladstoick Data 27 februarie 2014 16:31:58
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>

using namespace std;

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

const int N = 400105;

int MaxArb[N];

int n , m;

int pozitie, valoare;

void update(int left, int right, int nod){
    if( left == right ){
        MaxArb[nod] = valoare;
        return;
    }
    int mijloc = (left+right)/2;
    if( pozitie <= mijloc){
        update(left, mijloc, nod*2);
    } else {
        update(mijloc+1 , right, nod*2+1);
    }
    MaxArb[nod] = max(MaxArb[nod*2],  MaxArb[nod*2+1]);
}

int maxim, start, end;

void query( int left, int right, int nod){
    if ( start <= left && right <= end )
     {
          if ( maxim < MaxArb[nod] ) maxim = MaxArb[nod];
          return;
     }
    int mijloc = (left+right)/2;
    if( start <= mijloc){
        query(left , mijloc, nod*2);
    }
    if( mijloc < end){
        query(mijloc+1 , right, nod*2+1);
    }
}

int main()
{
    in>>n>>m;
    for(int i=1;i<=n;i++){
        int x;
        in>>x;
        pozitie = i;
        valoare = x;
        update(1,n,1);
    }
    for(int i=1;i<=m;i++){
        int tip, a, b ;
        in>>tip>>a>>b;
        if(tip == 1){
            pozitie = a;
            valoare = b;
            update(1,n,1);
        } else {
            maxim = -1;
            start = a;
            end = b;
            query(1, n, 1);
            out<<maxim<<"\n";
        }
    }

    return 0;
}