Cod sursa(job #3001364)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 13 martie 2023 15:56:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
using namespace std;

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

const int MAX = 1e5 + 1;

int v[MAX] , aint[4*MAX] , n , q , uv , poz , op , a , b , qst , qdr;

void init( int nod , int st , int dr ){

    if(st == dr) aint[nod] = v[st];
    else{

        int mij = (st+dr)/2;

        init(nod*2,st,mij);
        init(nod*2+1,mij+1,dr);

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

}

void update( int nod , int st , int dr ){

    if(st == dr) aint[nod] = uv;
    else{

        int mij = (st+dr)/2;

        if(poz <= mij) update(nod*2,st,mij);
        else update(nod*2+1,mij+1,dr);

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

int query( int nod , int st , int dr){

    if(qst<=st && dr<=qdr) return aint[nod];
    else{

        int mij = (st+dr)/2;

        int val = -1;

        if(qst <= mij) val = max(val,query(nod*2,st,mij));
        if(qdr > mij) val = max(val,query(nod*2+1,mij+1,dr));

        return val;
    }
}

int main(){

    cin >> n >> q;

    for(int i = 1 ; i <= n ; i++){

        cin >> v[i];
    }

    init(1,1,n);

    while(q--){

        cin >> op >> a >> b;

        if(op == 1){

            poz = a;
            uv = b;

            update(1,1,n);

        }else{


            qst = a;
            qdr = b;

            cout << query(1,1,n) << '\n';
        }
    }

    return 0;
}