Cod sursa(job #2417120)

Utilizator raducostacheRadu Costache raducostache Data 28 aprilie 2019 22:20:14
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>

#define NODMAX 400100

int n, q, x;
int type, a, b;
int mx, v[NODMAX];

void Actualizare(int, int, int, int, int);
void Interogare (int, int, int, int, int);

int main() {
    int i;
    FILE *f = fopen("arbint.in", "r");
    FILE *g = fopen("arbint.out", "w");

    fscanf(f, "%d %d\n", &n, &q);
    for(i = 1 ; i <= n ; ++i) {
        fscanf(f, "%d\n", &x);
        Actualizare(x, i, 1, n, 1);
    }
    while(q--) {
        fscanf(f, "%d %d %d\n", &type, &a, &b);
        if(type == 0) {
            mx = 0;
            Interogare(a, b, 1, n, 1);
            fprintf(g, "%d\n", mx);
        }
        else {
            Actualizare(b, a, 1, n, 1);
        }
    }
    return 0;
}

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

void Interogare(int a, int b, int st, int dr, int nod) {
    if(st >= a && dr <= b) {
        if(v[nod] > mx)
            mx = v[nod];
        return;
    }
    int mij = (st + dr) / 2;
    if(a <= mij)Interogare(a, b, st, mij, nod * 2);
    if(b >  mij)Interogare(a, b, mij + 1, dr, nod * 2 + 1);
}