Cod sursa(job #1651257)

Utilizator L.DanielLungu Daniel L.Daniel Data 12 martie 2016 21:14:54
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
//
//  main.cpp
//  Arbori de intervale
//
//  Created by Daniel Lungu on 05/03/16.
//  Copyright © 2016 Daniel Lungu. All rights reserved.
//

#include <cstdio>

#define MAX 400000

int arbore_intervale[MAX];
int pos, val;
int inceput, final;
int maxim;

void actualizare (int curent, int st, int dr)
{
    if ( st == dr )
    {
        arbore_intervale[curent] = val;
        return;
    }
    
    int mij = (st + dr) / 2;
    
    if (pos <= mij) actualizare(2*curent, st, mij);
    else actualizare(2*curent + 1 , mij + 1, dr);
    
    arbore_intervale[curent] = arbore_intervale[ 2 * curent] > arbore_intervale[ 2 * curent + 1] ?  arbore_intervale[curent] = arbore_intervale[2 * curent] : arbore_intervale[curent] = arbore_intervale[2 * curent + 1];

    
}

void interogare (int curent, int st, int dr)
{
    if ( inceput <= st && dr <= final )
    {
        if ( maxim < arbore_intervale[curent] ) maxim = arbore_intervale[curent];
        return;
    }
    
    int div = (st+dr)/2;
    if ( inceput <= div ) interogare(2*curent,st,div);
    if ( div < final ) interogare(2*curent+1,div+1,dr);
    
}

int main(int argc, const char * argv[]) {
 
    int M,N,x,a,b;
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    
    scanf("%d %d", &N, &M);
    
    for (int i =1; i <= N; i++)
    {
        scanf("%d", &val);
        pos = i;
        actualizare(1,1,N);
    }
    
    for (int i =1; i <= M; i++)
    {
        scanf("%d %d %d", &x, &a, &b);
        
        if ( x == 1){
            pos = a;
            val = b;
            actualizare(1,1,N);
        }else{
            maxim = -1;
            inceput = a;
            final = b;
            interogare(1,1,N);
            
            printf("%d\n", maxim);
            
        }
    }
    
    return 0;
}