Cod sursa(job #1487220)

Utilizator dec0o0dinu pinu dec0o0 Data 16 septembrie 2015 14:41:19
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <stdio.h>
#include <iostream>
using namespace std;
#include <set>
#include <list>
#include <vector>
#define dim 100001

int n, m;
int maxArb[4 * dim + 1];
int start, finish, val, pos, maxim;

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

void update(int, int, int);
void query(int, int, int);

int main(int argc, const char * argv[]) {
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int x;
    
    cin >> n >> m;
    for (int i = 1; i <= n; i++){
        cin >> x;
        pos = i;
        val = x;
        update(1, 1, n);
    }
    
    int a, b;
    for (int i = 1; i <= m; i++){
        cin >> x >> a >> b;
        if (x){
            pos = a;
            val = b;
            update(1, 1, n);
        }
        else{
            maxim = -1;
            start = a;
            finish = b;
            query(1, 1, n);
            
            cout << maxim << '\n';
        }
    }
    
    return 0;
}

void update(int nod, int left, int right){
    if (left == right){
        maxArb[nod] = val;
        return;
    }
    
    int mij = (left + right) / 2;
    if (pos <= mij)
        update(2 * nod, left, mij);
    else
        update(2 * nod + 1, mij + 1, right);
    
    maxArb[nod] = max(maxArb[2 * nod], maxArb[2 * nod + 1]);
}

void query(int nod, int left, int right){
    if (start <= left and right <= finish){
        if (maxim < maxArb[nod])
            maxim = maxArb[nod];
        return;
    }
    
    int mij = (left + right) / 2;
    if (start <= mij)
        query(2 * nod, left, mij);
    else
        query(2 * nod + 1, mij + 1, right);
}