Cod sursa(job #3135779)

Utilizator Marius_JalbaMarius Jalba Marius_Jalba Data 4 iunie 2023 14:27:13
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>

int arbore[4*100001+66];

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

void update(int nod, int st, int dr, int val, int pos)
{
    if (st == dr)
    {
        arbore[nod] = val;
    }
    else
    {
        int div = (st + dr) / 2;
        if (pos <= div)
        {
            update(2 * nod, st, div, val, pos);
        }
        else
        {
            update(2 * nod + 1, div + 1, dr, val, pos);
        }
        arbore[nod] = maxim(arbore[2 * nod], arbore[2 * nod + 1]);
    }
}

int query(int nod, int st, int dr, int s, int f)
{
    if (s <= st && dr <= f)
    {
        return arbore[nod];
    }
    int div = (st + dr) / 2;
    int max = 0;
    if (s <= div)
    {
        max = query(2 * nod, st, div, s, f);
    }
    if (div < f)
    {
        max = maxim(max, query(2 * nod + 1, div + 1, dr, s, f));
    }
    return max;
}

int main()
{
    int n = 0;
    int m = 0;
    int val = 0;
    int op = 0;
    int s = 0;
    int f = 0;
    int maximum = 0;

    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    scanf("%d %d", &n, &m);

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

    for (int i = 0; i < m; i++) 
    {
        scanf("%d %d %d", &op, &s, &f);
        if (op == 0)
        {
            maximum = -1; 
            maximum = query(1, 0, n - 1, s - 1, f - 1); 
            printf("%d\n", maximum);
        }
        else if (op == 1) 
        {
            update(1, 0, n - 1, f, s - 1);
        }
    }

    return 0;
}