Cod sursa(job #2659129)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 15 octombrie 2020 21:31:02
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <iostream>

#define NMAX 100001
using namespace std;

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

int N, Q, op, a, b;
int tree[4*NMAX];
int v[NMAX];

int maxi( int x, int y ){

    if( x > y ) return x;
    return y;
}

void Update( int nod, int lf, int rg, int val, int pos ){

    //cout << lf << ' ' << rg << ' ' <<  lf + ( rg - lf )/2 << '\n';
    if( lf == rg ){
        tree[nod] = val;
        return;
    }

    int mid = lf + ( rg - lf )/2;

    if( pos <= mid ) Update( nod*2, lf, mid, val, pos );
    else Update( nod*2+1, mid+1, rg, val, pos);

    tree[nod] = maxi( tree[nod*2], tree[nod*2+1] );
}

int Query( int nod, int lf, int rg, int L, int R ){

    if( L <= lf && rg <= R ) return tree[nod];

    int mid = lf + ( rg - lf )/2;

    int ans1, ans2;
    ans1 = ans2 = 0;

    if( L <= mid ) ans1 = Query( nod*2, lf, mid, L, R );
    if( mid < R ) ans2 = Query( nod*2+1, mid+1, rg, L, R);

    return maxi(ans1, ans2);

}
void AINT(){

    fin >> N >> Q;
    for( int i = 1; i <= N; ++i ){
        fin >> v[i];
        Update( 1, 1, N, v[i], i);
        //cout << Query( 1, 1, N, i, i) << ' ' << Query( 1, 1, N, 1, N) << '\n';
    }
    for( int q = 1; q <= Q; ++q ){
        fin >> op >> a >> b;
        if( op == 0 ){
            fout << Query( 1, 1, N, a, b ) << '\n';
        }
        else{
            Update( 1, 1, N, b, a);
        }
    }
}
int main()
{
    AINT();
    return 0;
}