Cod sursa(job #1996850)

Utilizator robertstrecheStreche Robert robertstreche Data 2 iulie 2017 18:45:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>

#define NMAX 400005

using namespace std;

int n;
int tree[NMAX];

inline void update(int pos, int left, int right, int x, int val){

    if (left == right)
        tree[pos] = val;
    else {
        int middle = (left + right) / 2;

        if (x <= middle)
            update(2 * pos, left, middle, x, val);
        else
            update(2 * pos + 1, middle + 1, right, x, val);

        tree[pos] = tree[2 * pos] >= tree[2 * pos + 1] ? tree[2 * pos] : tree[2 * pos + 1];
    }

    return;
}

inline int query(int pos, int left, int right, int left_pos, int right_pos){

    if (left_pos <= left && right <= right_pos)
        return tree[pos];
    else {
        int l = 0, r = 0;
        int middle = (left + right) / 2;

        if (left_pos <= middle)
            l = query(2 * pos, left, middle, left_pos, right_pos);
        if (right_pos  > middle)
            r = query(2 * pos + 1, middle + 1, right, left_pos, right_pos);

        return l <= r ? r : l;
    }
}

int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");

    int m, type, x, y;
    f >> n >> m;

    for (int i = 1; i <= n; i++){

        f >> x;
        update(1, 1, n, i, x);
    }

    for ( ; m; m--){

        f >> type >> x >> y;

        if (type == 0)
            g << query(1, 1, n, x, y) << '\n';
        else
            update(1, 1, n, x, y);
    }

    f.close();
    g.close();

    return 0;
}