Cod sursa(job #2269318)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 25 octombrie 2018 21:12:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
using namespace std;
#define maxd 100000
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int intervale[4 * maxd];
void update(int p, int position, int value, int left, int right){
     if(left == right) {
        intervale[p] = value;
        return;
     }
     int m = (left + right ) / 2;
     if(position > m) update(2 * p + 1, position, value, m + 1, right);
     else update(2 * p, position, value, left, m);
     intervale[p] = max(intervale[2 * p], intervale[2 * p + 1]);

}
int maxim;
void query(int p, int st, int dr, int left, int right){
    if(left >= st && right <= dr) {
        maxim = max(maxim, intervale[p]);
        return;
    }
    int m = (left + right ) / 2;
    if(st <= m) query(2 * p, st, dr, left, m);
    if(m < dr) query(2 * p + 1, st, dr, m + 1, right);
}
int main()
{
    int type, n, m, x;
    fin >> n >> m;
    for(int i = 1; i <= n; ++i){
        fin >> x;
        update(1, i, x, 1, n);
    }
    for(int i = 1; i <= m; ++i){
        fin >> type;
        if(type == 1){
            int pos, val;
            fin >> pos >> val;
            update(1, pos, val, 1, n);
        }
        else{
            int st, dr;
            fin >> st >> dr;
            maxim = 0;
            query(1, st, dr, 1, n);
            fout << maxim << '\n';
        }
    }
    return 0;
}