Cod sursa(job #1651255)

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

#include <iostream>
#include <fstream>

using namespace std;

#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);
    

    if(arbore_intervale[ 2 * curent] > arbore_intervale[ 2 * curent + 1])
        arbore_intervale[curent] = arbore_intervale[2 * curent];
    else
        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;
    ifstream myinfile("arbint.in");
    ofstream myoutfile("arbint.out");
    
    myinfile >> N >> M;
    
    for (int i =1; i <= N; i++)
    {
        myinfile >> val;
        pos = i;
        actualizare(1,1,N);
    }
    
    for (int i =1; i <= M; i++)
    {
        myinfile>>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);
            
            myoutfile <<maxim<<endl;
            
        }
    }
    
    myinfile.close();
    myoutfile.close();

    return 0;
}