Cod sursa(job #1825368)

Utilizator JavaAlexDinu Alexandru JavaAlex Data 9 decembrie 2016 00:21:24
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>

using namespace std;

int n, m, val_max;
int v[262144];
ifstream r("arbint.in");
ofstream w("arbint.out");
//cea mai mare putere
long cmmp(long val){
    long n=1;
    while(n < 2*val-1) n <<= 1;
    return n;
}

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

void update(int v[], int val, int st, int dr, int poz, int node){
    if(st == dr){
        v[node] = val;
        return;
    }
    int mij = (st+dr)/2;
    if(poz <= mij) update(v, val, st, mij, poz, 2*node);
    else update(v, val, mij+1, dr, poz, 2*node+1);
    v[node] = Max(v[2*node], v[2*node+1]);
}

void query(int v[], int st, int dr, int a, int b, int node){
    if(a <= st && b >= dr){
        val_max = Max(val_max, v[node]);
        return;
    }
    int mij = (st+dr)/2;
    if(a <= mij) query(v,  st, mij, a, b, node*2);
    if(mij < b) query(v,  mij+1, dr, a, b ,node*2+1);
}

int main(){
    int c, a, b, i;
    r>>n>>m;
    for(i=1; i<=n; i++){
        r>>c;
        update(v, c, 1, n, i, 1);
    }
    for(i=1; i<=n; i++){
        r>>c>>a>>b;
        if(c == 0){
            val_max = -1;
            query(v, 1, n, a, b, 1);
            w<<val_max<<endl;
        }
        else update(v, b, 1, n, a, 1);
    }
    return 0;
}