Cod sursa(job #1620511)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 29 februarie 2016 10:25:28
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>

#define NMax 100010

using namespace std;

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

int n, queries, v[NMax], 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;
    else {
        int mid = (left+right) / 2;

        if (mid <= a)
            update(2*node, 1, 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 (mid < right)
            getMax(2*node + 1, mid+1, right);
    }
}

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

        update(1, 1, n, v[i]);
    }

    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;
}