Cod sursa(job #1776694)

Utilizator victorpapa98Papa Victor-Alexandru victorpapa98 Data 11 octombrie 2016 18:49:57
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
# include <cstdio>
# include <algorithm>
using namespace std;

FILE *f = freopen("arbint.in", "r", stdin);
FILE *g = freopen("arbint.out", "w", stdout);

const int N_MAX = 100001;

int arb_int[4 * N_MAX];

int n, m, x, maxim;

void query(int nod, int start, int finish, int a, int b)
{
    if (start >= a && b >= finish)
    {
        if (maxim < arb_int[nod])
            maxim = arb_int[nod];

        return ;
    }

    int left_son = nod << 1;
    int right_son = (nod << 1) + 1;
    int mij = (start + finish) / 2;

    if (a <= mij)
        query(left_son, start, mij, a, b);

    if (b > mij)
        query(right_son, mij+1, finish, a, b);
}

void update(int nod, int start, int finish, int a, int b)
{
    if (start == finish)
    {
        arb_int[nod] = b;
        return ;
    }

    int left_son = nod << 1;
    int right_son = (nod << 1) + 1;
    int mij = (start + finish) / 2;

    if (a <= mij)
        update(left_son, start, mij, a, b);
    else
        update(right_son, mij+1, finish, a, b);

    arb_int[nod] = max(arb_int[left_son], arb_int[right_son]);
}

void read_and_solve()
{
    scanf("%d %d", &n, &m);

    for (int i=1; i<=n; i++)
    {
        scanf("%d", &x);
        update(1, 1, n, i, x);
    }

    for (int i=1; i<=m; i++)
    {
        int t, a, b;

        scanf("%d %d %d", &t, &a, &b);

        if (t == 0)
        {
            maxim = 0;
            query(1, 1, n, a, b);
            printf("%d\n", maxim);
        }
        else
            update(1, 1, n, a, b);
    }
}

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