Cod sursa(job #1128298)

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

using namespace std;

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

const int N = 400105;

int MaxArb[N];

int n , m;

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

int maxim;

void query(int start, int end, 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(start, end, left , mijloc, nod*2);
    }
    if( mijloc < end){
        query(start, end, mijloc+1 , right, nod*2+1);;
    }
}

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

    return 0;
}