Cod sursa(job #1829350)

Utilizator Emil64Emil Centiu Emil64 Data 14 decembrie 2016 20:31:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>

using namespace std;

int v[1<<18];

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

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

        int m = (st + dr) / 2;
        if(pos <= m){
            update(st, m, 2 * nod, val, pos);
        }
        else{
            update(m + 1, dr, 2 * nod + 1, val, pos);
        }
        v[nod] = max(v[2 * nod], v[2 * nod + 1]);
    }
}

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

    if(a <= st && dr <= b){
        return v[nod];
    }
    else{

        int m = (st + dr) / 2;
        int m1 = -1, m2 = -1;
        if(a <= m){
            m1 = query(st, m, 2 * nod, a, b);
        }
        if(m < b){
            m2 = query(m + 1, dr, 2 * nod + 1, a, b);
        }
        return max(m1, m2);
    }
}


int main()
{

    ifstream f("arbint.in");
    ofstream g("arbint.out");

    int n, m, cr, val;
    f >> n >> m;

    for(int i = 1; i <= n; i++){
        f >> val;
        update(1, n, 1, val, i);
    }

    for(int i = 1; i <= m; i++){
        int a, b;
        f >> cr >> a >> b;
        if(cr == 0){
            g << query(1, n, 1, a, b) << "\n";
        }
        else{
            update(1, n, 1, b, a);
        }
    }
}