Cod sursa(job #1047332)

Utilizator IonSebastianIon Sebastian IonSebastian Data 4 decembrie 2013 11:30:33
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

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

const int N = 1<<18, CEVA = 100001;
int poz, val, a, b, t[N];

int maxim(int x, int y){
    if(x >= y){
        return x;
    }
    return y;
}

int query(int p, int st, int dr){
    if(a<=st && dr<=b){
        return t[p];
    }
    int m = (st+dr)/2, m1 = -N, m2 = -N;
    if(a <= m){
        m1 = query(2*p, st, m);
    }
    if(m+1 <= b){
        m2 = query(2*p+1, m+1, dr);
    }
    return maxim(m1, m2);
}

void update(int p, int st, int dr){
    if(st == dr){
         t[p] = val;
         return;
    }
    int m = (st+dr)/2;
    if(poz <= m){
        update(2*p, st, m);
    } else {
        update(2*p+1, m+1, dr);
    }
    t[p] = maxim(t[2*p], t[2*p+1]);
}

int main(){
    int n, m, type, i;
    in >> n >> m;
    for(i = 1; i <= n; i++){
        in >> val;
        poz = i;
        update(1, 1, n);
    }
    for(i = 1; i <= m; i++){
        in >> type;
        if(type == 0){
            in >> a >> b;
            out << query(1, 1, n) << "\n";
        } else {
            in >> poz >> val;
            update(1, 1, n);
        }
    }
}