Cod sursa(job #834005)

Utilizator andreidanAndrei Dan andreidan Data 13 decembrie 2012 16:54:57
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int maxi[4*100001+66];
int n,m;
int  val, pos, maxim, inceput, sfarsit;

void actualizare(int nod, int st, int dr){
    if(st == dr){
        maxi[nod] = val;
        return;
    }
    else{
        int mij = (st + dr)/2;
        if(pos <= mij) actualizare(2 * nod, st, mij);
        else actualizare (2 * nod + 1, mij + 1, dr);

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

void interogare(int nod, int st, int dr){
    if(inceput <= st && dr <= sfarsit){
        if(maxim < maxi[nod]) maxim = maxi[nod];
        return ;
    }
    int mij = (st + dr)/2;
    if ( inceput <= mij ) interogare(2*nod,st,mij);
     if ( mij < sfarsit ) interogare(2*nod+1,mij+1,dr);
}


int main (){
    int i,j,x,op,a,b;
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    scanf("%d %d", &n, &m);

    for(i = 1; i <= n ; ++i) {
        scanf("%d", &x);
        pos = i;
        val = x;
        actualizare(1,1,n);
    }

    for(i = 1; i <= m; ++i){
        scanf("%d %d %d", &op,&a, &b);
        if(x == 1){
            maxim = -1;
            inceput = a,
            sfarsit = b;
            interogare(1,1,n);
            printf("%d\n", maxim);

        }
        else{
            pos =a, val = b;
           actualizare(1,1,n);
        }

    }





}