Cod sursa(job #3135895)

Utilizator rafaelmedelean03Medelean Rafael Catalin rafaelmedelean03 Data 4 iunie 2023 17:21:32
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#include<stdio.h>
#include<stdlib.h>

#define MAX 400002

#define max(a, b) (a > b ? a : b)
#define inpath "arbint.in"
#define outpath "arbint.out"

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

    int mid = (st + dr) / 2;

    if(poz <= mid)
    {
        update(st, mid, 2 * nod, poz, val, v);
    }
    else
    {
        update(mid + 1, dr, 2 * nod + 1, poz, val, v);
    }

    v[nod] = max(v[2 * nod], v[2 * nod + 1]);
}

int querry(int st, int dr, int nod, int a, int b, int *v)
{
    if(a <= st && dr <= b)
    {
        return v[nod];
    }

    int mid = (st + dr) / 2;

    int val1 = 0, val2 = 0;

    if(a <= mid)
    {
        val1 = querry(st, mid, 2 * nod, a, b, v);
    }
    if(b > mid)
    {
        val2 = querry(mid + 1, dr, 2 * nod + 1, a, b, v);
    }

    return max(val1, val2);
}

int main()
{
    int n = 0, m = 0, v[MAX];

    FILE *in = NULL, *out = NULL;

    if( (in = fopen(inpath, "r")) == NULL )
    {
        printf("Eroare la deschiderea fisierului %s.\n", inpath);
        exit(EXIT_FAILURE);
    }

    if( (out = fopen(outpath, "w")) == NULL )
    {
        printf("Eroare la deschiderea fisierului %s.\n", outpath);
        exit(EXIT_FAILURE);
    }

    if( fscanf(in, "%d %d", &n, &m) != 2 )
    {
        printf("Eroare la citirea din fisierul %s.\n", inpath);
        exit(EXIT_FAILURE);
    }

    int valoare = 0;

    for(int i = 0; i < n; i++)
    {
        if( fscanf(in, "%d", &valoare) != 1 )
        {
            printf("Eroare la citirea din fisierul %s.\n", inpath);
            exit(EXIT_FAILURE);
        }

        update(1, n, 1, i + 1, valoare, v);
    }

    int operatie = 0, a = 0, b = 0;

    for(int i = 0; i < m; i++)
    {
        if( fscanf(in, "%d %d %d", &operatie, &a, &b) != 3 )
        {
            printf("Eroare la citirea din fisierul %s.\n", inpath);
            exit(EXIT_FAILURE);
        }

        if( operatie == 1 )
        {
            update(1, n, 1, a, b, v);
        }
        else
        {
            fprintf(out, "%d\n", querry(1, n, 1, a, b, v));
        }
    }

    if( fclose(in) != 0 )
    {
        printf("Eroare la inchiderea fisierului %s.\n", inpath);
        exit(EXIT_FAILURE);
    }

    if( fclose(out) != 0 )
    {
        printf("Eroare la inchiderea fisierului %s.\n", outpath);
        exit(EXIT_FAILURE);
    }

    return 0;
}