Cod sursa(job #2403047)

Utilizator AteveuPescaru Andrei Ateveu Data 11 aprilie 2019 11:13:17
Problema Arbori de intervale Scor 0
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int MaxArb[100001*4+66];
int N, M;
int Pos, Val, maxim, start, finish;
bool k;

void Update(int nod, int left, int right){
    if(left == right) MaxArb[nod] = Val;
    else{
        int div = (left+right)/2;
        if(Pos <= div) Update(2*nod, left, div);
        else Update(2*nod+1, div+1, right);
        MaxArb[nod] = max(MaxArb[2*nod], MaxArb[2*nod+1]);
    }
}

void Query(int nod, int left, int right){
    if(start <= left && right <= finish){
        if(maxim < MaxArb[nod]) maxim = MaxArb[nod];
    }
    else{
        int div = (left+right)/2;
        if(start <= div) Query(2*nod, left, div);
        if(div <= finish) Query(2*nod+1, div+1, right);
    }
}

void Solve(){
    fin>>N>>M;
    for(int i = 0; i < N; i++){
        Pos = i;
        fin>>Val;
        Update(1, 1, N);
    }
    for(int i = 0; i < M; i++){
        fin>>k;
        if(!k){
            fin>>start>>finish;
            maxim = -1;
            Query(1, 1, N);
            fout<<maxim<<'\n';
        }
        else{
            fin>>Pos>>Val;
            Update(1, 1, N);
        }
    }
}
int main()
{
    Solve();
    return 0;
}