Cod sursa(job #1620735)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 29 februarie 2016 12:21:19
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

#define NMax 200010

using namespace std;

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

int n, queries, elem, intTree[NMax], cmd, a, b, Max;

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

void update(int node, int left, int right, int val)
{
    if (left == right){
        intTree[node] = val;
        return ;
    }
    else {
        int mid = (left+right) / 2;

        if (a<=mid)
            update(2*node, left, mid, val);
        else
            update(2*node + 1, mid+1, right, val);

        intTree[node] = getMax(intTree[2*node], intTree[2*node+1]);
    }
}

void getMax(int node, int left, int right)
{
    if (a <= left && b >= right)
        Max = getMax(Max, intTree[node]);
    else {
        int mid = (left + right) / 2;

        if (a <= mid)
            getMax(2*node, left, mid);
        if (b > mid)
            getMax(2*node + 1, mid + 1, right);
    }
}

int main()
{
    f >> n >> queries;
    for (int i=1; i<=n; i++) {
        f>>elem;
        a = i;

        update(1, 1, n, elem);
    }

    for (int i = 1; i <= queries; i++) {
        f>>cmd>>a>>b;

        if (cmd == 0) {
            Max = -1;
            getMax(1, 1, n);
            g << Max<<"\n";
        }
        else
            update(1, 1, n, b);
    }

    return 0;
}