Cod sursa(job #1498810)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 9 octombrie 2015 11:32:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#define DIM 100005
using namespace std;
int n, m, i, t, a, b, maxim;
int v[DIM], A[4 * DIM];
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void build(int nod, int st, int dr){
    if(st == dr){
        A[nod] = v[st];
    }
    else{
        int mid = (st + dr) / 2;
        build(2 * nod, st, mid);
        build(2 * nod + 1, mid + 1, dr);
        A[nod] = max(A[2 * nod], A[2 * nod + 1]);
    }
}
void update(int nod, int st, int dr, int a, int b){
    if(st == dr){
        A[nod] = b;
    }
    else{
        int mid = (st + dr) / 2;
        if(a <= mid){
            update(2 * nod, st, mid, a, b);
        }
        if(a > mid){
            update(2 * nod + 1, mid + 1, dr, a, b);
        }
        A[nod] = max(A[2 * nod], A[2 * nod + 1]);
    }
}
void query(int nod, int st, int dr, int a, int b){
    if(a <= st && dr <= b){
        maxim = max(maxim, A[nod]);
    }
    else{
        int mid = (st + dr) / 2;
        if(a <= mid){
            query(2 * nod, st, mid, a, b);
        }
        if(b > mid){
            query(2 * nod + 1, mid + 1, dr, a, b);
        }
    }
}
int main(){
    fin>> n >> m;
    for(i = 1; i <= n; i++){
        fin>> v[i];
    }
    build(1, 1, n);
    for(i = 1; i <= m; i++){
        fin>> t >> a >> b;
        if(t == 0){
            maxim = 0;
            query(1, 1, n, a, b);
            fout<< maxim <<"\n";
        }
        else{
            update(1, 1, n, a, b);
        }
    }
    return 0;
}