Cod sursa(job #1816435)

Utilizator victorpapa98Papa Victor-Alexandru victorpapa98 Data 26 noiembrie 2016 14:47:00
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
# include <cstdio>
# include <algorithm>
using namespace std;

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

const int N_MAX = 100010;

int arb_int[4 * N_MAX];
int v[N_MAX];

int n, m;

void update(int nod, int start, int finish, int poz, int val)
{
    if (start == finish)
    {
        if (start == poz)
            arb_int[nod] = val;
    }
    else
    {
        int left_son = (nod<<1);
        int right_son = left_son + 1;
        int mid = (start + finish) / 2;

        update(left_son, start, mid, poz, val);
        update(right_son, mid+1, finish, poz, val);

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

int query(int nod, int start, int finish, int left, int right)
{
    if (left <= start && finish <= right)
        return arb_int[nod];

    int left_son = (nod<<1);
    int right_son = left_son + 1;
    int mid = (start + finish) / 2;
    int ans = -1;

    if (left <= mid)
        ans = max(ans, query(left_son, start, mid, left, right));
    if (right > mid)
        ans = max(ans, query(right_son, mid+1, finish, left, right));

    return ans;
}

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

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

    for (int i=1; i<=m; i++)
    {
        int t, x, y;

        scanf("%d %d %d", &t, &x, &y);

        if(t == 1)
            update(1, 1, n, x, y);
        else
        {
            int ans = query(1, 1, n, x, y);
            printf("%d\n", ans);
        }
    }
}

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