Cod sursa(job #2497928)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 23 noiembrie 2019 12:29:44
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m;
int arb[410000];

void dep(int p, int & d, int st = 1, int en = n){
    int m = (st+en)/2;
    if(st == en){
        return;
    }else if(p >= st && p <= m){
        d *= 2;
        dep(p, d, st, m);
    }else if(p >= m+1 && p <= en){
        d *= 2;
        d += 1;
        dep(p, d, m+1, en);
    }
}

void rep(int p, int a){
    int d = 1;
    dep(p, d);
    arb[d] = a;
    for(int i = d/2; i >= 1; i /= 2){
        arb[i] = max(arb[i*2], arb[i*2+1]);
    }
}

int cal(int a, int b, int p = 1, int st = 1, int en = n){
    if(st == a && en == b){
        return arb[p];
    }
    int m = (st+en)/2;
    if(a >= st && a <= m){
        if(b <= m){
            return cal(a, b, 2*p, st, m);
        }else{
            return max(cal(a, m, 2*p, st, m), cal(m+1, b, 2*p+1, m+1, en));
        }
    }else{
        return cal(a, b, 2*p+1, m+1, en);
    }
}

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

    for(int i = 0; i < m; ++i){
        int op, a, b;
        fin >> op >> a >> b;
        if(op == 0){
            fout << cal(a, b) << "\n";
        }else{
            rep(a, b);
        }
    }

    return 0;
}