Cod sursa(job #2958833)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 28 decembrie 2022 15:51:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
using namespace std;

//////////////////////////////////////

const int MAX = 1e5 + 1;

int aint[4 * MAX] , v[MAX] , n , q , st , dr , aux, poz , newval;

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

/////////////////////////////////////////////

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

    if( st == dr ){

        aint[nod] = v[st];

        return v[st];

    }else{

        int mij = (st+dr)/2;

        aint[nod] = max(init(nod*2,st,mij),init(nod*2+1,mij+1,dr));

        return aint[nod];
    }

}

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

    if( st == dr ){

        aint[nod] = val;

    }else{

        int mij = (st+dr)/2;

        if( pos <= mij ){

            update(nod*2 , st , mij , pos , val);
        }

        if( pos > mij ){

            update(nod*2 + 1 , mij + 1 , dr , pos , val);
        }

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

    }

}

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

    if( qst <= st && dr <= qdr ){

        return aint[nod];
    }

    int mij = (st+dr)/2;

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

    return max(query(nod*2,st,mij,qst,qdr),query(nod*2+1,mij+1,dr,qst,qdr));
}

int main()
{

    cin >> n >> q;

    for(int i = 1 ; i <= n ; i++) cin >> v[i];

    init(1,1,n);

    while(q--){

        cin >> aux;

        if(!aux){

            cin >> st >> dr;

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

        if(aux){

            cin >> poz >> newval;

            update(1,1,n,poz,newval);
        }
    }

    return 0;
}