Cod sursa(job #2422085)

Utilizator kodama cheama alex koda Data 17 mai 2019 10:07:14
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>

using namespace std;

const int INT = 2147483647;

int arb[262146]; //a 2a cea mai mare putere a lui 2 dupa n. +2, ca sa fie
int val, poz, a, b;

void update (int p, int st, int dr) {
    //actualizez elem de pe pozitia poz cu val
    if ( st == dr ) {
        arb[p] = val;
        return;
    }
    int m = ( st + dr ) / 2;
    if ( poz <= m )
        update ( 2*p, st, m );
    else
        update ( 2*p+1, m+1, dr );
    arb[p] = max( arb[2*p], arb[2*p+1] );
}

int query (int p, int st, int dr) {
    //returneaza max( [st,dr] x [a,b] )
    if ( a <= st && dr <= b )
        return arb[p];
    int m = (st + dr)/2, mst = -INT, mdr = -INT;
    if ( a <= m )
        mst = query(2*p, st, m);
    if ( b > m )
        mdr = query(2*p+1, m+1, dr);
    return max(mst,mdr);
}

int main () {
    ifstream fin ("arbint.in");
    ofstream fout ("arbint.out");
    int n, m, type;
    fin>>n>>m;
    for ( int i = 1; i <= n; i++ ) {
        fin>>val;
        poz = i;
        update(1, 1, n);
    }
    for ( int i = 1; i <= m; i++ ) {
        fin>>type;
        if ( type == 0 ) {
            fin>>a>>b;
            fout<<query(1,1,n)<<'\n';
        } else {
            fin>>a>>b;
            poz = a; val = b;
            update(1,1,n);
        }
    }
    return 0;
}