Cod sursa(job #3357452)

Utilizator bree.vtxKohl Briana bree.vtx Data 9 iunie 2026 20:33:51
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#include <stdio.h>

#define MAXN 100001

int arb[4 * MAXN];
int v[MAXN];

int max(int x, int y) {
    return (x > y) ? x : y;
}

void build(int nod, int st, int dr) {
    if (st == dr) {
        arb[nod] = v[st];
        return;
    }
    
    int mij = (st + dr) / 2;
    build(2 * nod, st, mij);
    build(2 * nod + 1, mij + 1, dr);
    
    arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}

void update(int nod, int st, int dr, int poz, int val) {
    if (st == dr) {
        arb[nod] = val;
        return;
    }
    
    int mij = (st + dr) / 2;
    if (poz <= mij) {
        update(2 * nod, st, mij, poz, val);
    } else {
        update(2 * nod + 1, mij + 1, dr, poz, val);
    }
    
    arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}

int query(int nod, int st, int dr, int L, int R) {
    if (L <= st && dr <= R) {
        return arb[nod];
    }
    
    int mij = (st + dr) / 2;
    int rez_st = -1, rez_dr = -1;
    
    if (L <= mij) {
        rez_st = query(2 * nod, st, mij, L, R);
    }
    if (R > mij) {
        rez_dr = query(2 * nod + 1, mij + 1, dr, L, R);
    }
    
    return max(rez_st, rez_dr);
}

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

    if (fin == NULL || fout == NULL) {
        printf("Eroare la deschiderea fisierelor!\n");
        if (fin) fclose(fin);
        if (fout) fclose(fout);
        return 1;
    }

    int n, m;
    if (fscanf(fin, "%d %d", &n, &m) != 2) {
        printf("Eroare la citirea datelor de intrare!\n");
        fclose(fin);
        fclose(fout);
        return 1;
    }

    for (int i = 1; i <= n; i++) {
        if (fscanf(fin, "%d", &v[i]) != 1){
            printf("Eroare la citirea elementelor vectorului!\n");
            fclose(fin);
            fclose(fout);
            return 1;
        } 
    }

    build(1, 1, n);

    for (int i = 0; i < m; i++) {
        int tip, a, b;
        if (fscanf(fin, "%d %d %d", &tip, &a, &b) == 3) {
            if (tip == 0) {
                fprintf(fout, "%d\n", query(1, 1, n, a, b));
            } else if (tip == 1) {
                update(1, 1, n, a, b);
            }
        }
    }

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