Cod sursa(job #1050585)

Utilizator dnprxDan Pracsiu dnprx Data 8 decembrie 2013 19:19:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <algorithm>

using namespace std;

int a[525000], n, n1;

void Update(int p, int x)
{
    int k;
    a[p] = x;
    while (p >= 1)
    {
        if (p % 2 == 1) p--;
        k = p / 2;
        a[k] = max(a[p], a[p + 1]);
        p = k;
    }
}

// care este maximul din intervalul [x, y]
int Query(int p, int x, int y, int st, int dr)
{
    int m;
    if (x == st && y == dr)
        return a[p];
    else
    {
        m = (st + dr) / 2;
        if (y <= m) // [x, y] inclus in [st, m]
            return Query(2 * p, x, y, st, m);
        else if (m + 1 <= x) // [x,y] inclus in [m+1, dr]
            return Query(2 * p + 1, x, y, m + 1, dr);
        else // x <= m < y
            return max(Query(2 * p, x, m, st, m), Query(2*p+1, m + 1, y, m+1, dr));
    }
}

void Citire()
{
    int i, m, k, op, x, y;
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin >> k >> m;
    n = 1;
    while (n < k)
        n *= 2;
    n1 = 2 * n - 1;
    for (i = n; i < n + k; i++)
        fin >> a[i];
    for (i = n - 1; i >= 1; --i)
        a[i] = max(a[2 * i], a[2 * i + 1]);

    for (i = 1; i <= m; i++)
    {
        fin >> op >> x >> y;
        if (op == 0)
            fout << Query(1, x, y, 1, n) << "\n";
        else
            Update(n + x - 1, y);
    }
    fin.close();
    fout.close();
}

int main()
{
    Citire();
    return 0;
}