Cod sursa(job #3358049)

Utilizator Ilie_Andra_MariaIlie Andra Maria Ilie_Andra_Maria Data 14 iunie 2026 10:45:23
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <stdio.h>

long arbint[400005];
long v[100005];

long maxim(long x, long y)
{
    if (x > y) return x;
    else return y;
}

void construieste(long nod, long st, long dr)
{
    if (st == dr)
    {
        arbint[nod] = v[st];
        return;
    }

    long mij = (st + dr) / 2;
    construieste(2 * nod, st, mij);
    construieste(2 * nod + 1, mij + 1, dr);

    arbint[nod] = maxim(arbint[2 * nod], arbint[2 * nod + 1]);
}

void modifica(long nod, long st, long dr, long poz, long val)
{
    if (st == dr)
    {
        arbint[nod] = val;
        return;
    }

    long mij = (st + dr) / 2;
    if (poz <= mij)
    {
        modifica(2 * nod, st, mij, poz, val);
    }
    else
    {
        modifica(2 * nod + 1, mij + 1, dr, poz, val);
    }

    arbint[nod] = maxim(arbint[2 * nod], arbint[2 * nod + 1]);
}

long intreaba(long nod, long st, long dr, long L, long R)
{
    if (L <= st && dr <= R)
    {
        return arbint[nod];
    }

    long mij = (st + dr) / 2;
    long rez_stang = -1, rez_drept = -1;

    if (L <= mij)
    {
        rez_stang = intreaba(2 * nod, st, mij, L, R);
    }
    if (R > mij)
    {
        rez_drept = intreaba(2 * nod + 1, mij + 1, dr, L, R);
    }

    return maxim(rez_stang, rez_drept);
}

int main()
{
    FILE *fin = fopen("arbint.in", "r");
    FILE *fout = fopen("arbint.out", "w");

    if (fin == NULL || fout == NULL) {
        return 0;
    }

    long n, m;
    if (fscanf(fin, "%ld %ld", &n, &m) != 2) {
        fclose(fin); fclose(fout); return 0;
    }

    long i;
    for (i = 1; i <= n; i++)
    {
        fscanf(fin, "%ld", &v[i]);
    }

    construieste(1, 1, n);

    while (m > 0)
    {
        long tip, a, b;
        fscanf(fin, "%ld %ld %ld", &tip, &a, &b);

        if (tip == 0)
        {
            fprintf(fout, "%ld\n", intreaba(1, 1, n, a, b));
        }
        else if (tip == 1)
        {
            modifica(1, 1, n, a, b);
        }

        m--;
    }

    fclose(fin);
    fclose(fout);
    return 0;
}