Cod sursa(job #3357465)

Utilizator alexandru.simoneaSimonea Alexandru alexandru.simonea Data 10 iunie 2026 00:39:29
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.44 kb
#include <stdio.h>
#include <stdlib.h>

FILE *in, *out;
int n, m;
int v[100001];
int aint[400001];

void build(int nod, int st, int dr)
{
    if(st == dr)
    {
        aint[nod] = v[st];
        return;
    }

    int mijloc = (st+dr)/2;

    build(2*nod, st, mijloc);
    build(2*nod+1, mijloc+1, dr);

    if(aint[2*nod] > aint[2*nod+1])
        aint[nod] = aint[2*nod];
    else
        aint[nod] = aint[2*nod+1];
}

int query(int nod, int st, int dr, int a, int b)
{
    if(a <= st && dr <= b)
        return aint[nod];

    if(dr < a || st > b)
        return -1;

    int mijloc = (st+dr)/2;
    int stanga = query(2*nod, st, mijloc, a, b);
    int dreapta = query(2*nod+1, mijloc+1, dr, a, b);
    
    if(stanga > dreapta)
        return stanga;
    else
        return dreapta;
}

void update(int nod, int st, int dr, int poz, int val)
{
    if(st == dr)
    {
        aint[nod] = val;
        return;
    }

    int mijloc = (st+dr)/2;
    if(poz <= mijloc)
        update(2*nod, st, mijloc, poz, val);
    else
        update(2*nod+1, mijloc+1, dr, poz, val);

    if(aint[nod*2] > aint[nod*2+1])
        aint[nod] = aint[nod*2];
    else
        aint[nod] = aint[nod*2+1];
}

int main(void)
{
    in = fopen("arbint.in", "r");
    out = fopen("arbint.out", "w");

    if(in == NULL)
    {
        perror("eroare la deschidere fisier de intrare\n");
        exit(EXIT_FAILURE);
    }
    if(out == NULL)
    {
        perror("eroare la deschidere fisier de iesire\n");
        exit(EXIT_FAILURE);
    }

    if(fscanf(in, "%d %d", &n, &m) != 2)
    {
        perror("eroare la citire date de intrare\n");
        exit(EXIT_FAILURE);
    }

    for(int i = 1; i <= n; i++)
    {
        if(fscanf(in, "%d", &v[i]) != 1)
        {
            perror("eroare la citire elemente tablou\n");
            exit(EXIT_FAILURE);
        }
    }

    build(1, 1, n);

    for(int i = 1; i <= m; i++)
    {
        int op, a, b;
        if(fscanf(in, "%d %d %d", &op, &a, &b) != 3)
        {
            perror("eroare la citire operatii\n");
            exit(EXIT_FAILURE);
        }

        //efectuare operatii
        if(op == 0)
            fprintf(out, "%d\n", query(1, 1, n, a, b));
        else
            update(1, 1, n, a, b);

    }

    if(fclose(in) != 0)
    {
        perror("eroare la inchidere fisier intrare\n");
        exit(EXIT_FAILURE);
    }
    if(fclose(out) != 0)
    {
        perror("eroare la inchidere fisier iesire\n");
        exit(EXIT_FAILURE);
    }

    return 0;
}