Cod sursa(job #1077288)

Utilizator zebsterAlex Grosu zebster Data 11 ianuarie 2014 10:40:04
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <queue>

using namespace std;

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

int n, m;
int v[4*100001];
int x1, y1;

int maxim(int a, int b){
    if(a > b )return a;
    return b;
}

void update(int nod, int poz, int x, int st, int dr)
{
    if(st == dr){
        v[nod] = x;
    }
    else{
        int m = (st+dr)/2;
        if(poz <= m)update(2*nod, poz, x, st, m);
        else update(2*nod+1, poz, x, m+1, dr);
        v[nod] = maxim(v[2*nod], v[nod*2+1]);
    }
}

int query(int nod, int st, int dr, int a, int b){
    if(st >= a && dr <= b){
        return v[nod];
    }
    else{
        x1 = -1, y1 = -1;
        int m = (st+dr)/2;
        if(m >= a){
            x1 = query(nod*2, st, m, a, b);
        }
        if(m+1 <= b){
            y1 =  query(nod*2+1, m+1, dr, a, b);
        }
        return maxim(x1, y1);
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++){
        int x;
        fin>>x;
        update(1, i, x, 1, n);
    }

    for(int i=1; i<=m; i++){
        int x, a, b;
        fin>>x>>a>>b;

        if(x == 0){
            int maximus = query(1, 1, n, a, b);
            fout<<maximus<<'\n';
        }
        else{
            update(1, a, b, 1, n);
        }
    }
}