Cod sursa(job #1479916)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 1 septembrie 2015 17:36:47
Problema Arbori de intervale Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
/*
 * =====================================================================================
 *
 *       Filename:  interval_tree_infoarena.cpp
 *
 *    Description:  http://www.infoarena.ro/problema/arbint
 *
 *        Version:  1.0
 *        Created:  09/01/2015 04:53:45 PM
 *       Revision:  none
 *       Compiler:  gcc/g++
 *
 *         Author:  Marius-Constantin Melemciuc  
 *          email:  
 *   Organization:  
 *
 * =====================================================================================
 */

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int n, m;
vector<int> interval_tree;

int max(int a, int b) {
    return (a > b? a: b);
}

void update(int i, int left, int right, int position, int value) {
    if (left == right) {
        interval_tree[i] = value;
        return;
    }
    
    int middle = left + ((right - left) >> 1);
    
    if (position <= middle) {
        update((i << 1), left, middle, position, value);
    } else {
        update((i << 1) + 1, middle + 1, right, position, value);
    }
    interval_tree[i] = max(interval_tree[(i << 1)], 
                           interval_tree[(i << 1) + 1]);
}

void query(int i, int left, int right, int a, int b, int& max_value) {
    if (a <= left && b >= right) {
        if (interval_tree[i] > max_value) {
            max_value = interval_tree[i];
        }
        return ;
    }
    
    int middle = left + ((right - left) >> 1);
    
    if (a <= middle) {
        query((i << 1), left, middle, a, b, max_value);
    }
    if (b > middle) {
        query((i << 1) + 1, middle + 1, right, a, b, max_value);
    }
}

int main() {
    ifstream in("arbint.in");
    ofstream out("arbint.out");
    int operation; 
    int x, y;

    in >> n >> m;

    interval_tree.resize(n * 2, 0);

    int value;
    for (int i = 1; i <= n; i++) { 
        in >> value;
        update(1, 1, n, i, value);
    }
    
    int max_value = -1; 
    for (int i = 0; i < m; i++) {
        in >> operation >> x >> y;
        if (operation == 0) {
            max_value = -1;
            query(1, 1, n, x, y, max_value);
            out << max_value << "\n";
        }
        if (operation == 1) {
            update(1, 1, n, x, y);
        }
    }

    in.close();
    out.close(); 

    return 0;
}