Cod sursa(job #2436278)

Utilizator NineshadowCarapcea Antonio Nineshadow Data 5 iulie 2019 13:17:52
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>
#define TREE_MAXN 400004
#define MAXN 100001

int n, m, v[MAXN], t[TREE_MAXN];

int max(int a, int b) {
    return a > b ? a : b;
}

int min(int a, int b) {
    return a < b ? a : b;
}

void build(int nod, int st, int dr) {
    if(st == dr) {
        t[nod] = v[st];
        return;
    }
    int mij = st + (dr - st) / 2, left_child = nod << 1,
        right_child = (nod << 1) + 1;
    build(left_child, st, mij);
    build(right_child, mij + 1, dr);
    t[nod] = max(t[left_child], t[right_child]);
}

int query(int nod, int t_st, int t_dr, int st, int dr) {
    if(st > dr) 
        return 0;
    if(st == t_st && dr == t_dr)
        return t[nod];
    int mij = t_st + (t_dr - t_st) / 2;
    return max(query(nod << 1, t_st, mij, st, min(dr, mij)),
        query((nod << 1) + 1, mij + 1, t_dr, max(st, mij + 1), dr));
}

void update(int nod, int st, int dr, int pos, int val) {
    if(st == dr) {
        t[nod] = val;
        return;
    }
    int mij = st + (dr - st) / 2;
    if(pos <= mij) {
        update(nod << 1, st, mij, pos, val);
    } else {
        update((nod << 1) + 1, mij + 1, dr, pos, val);
    }
    t[nod] = max(t[nod << 1], t[(nod << 1) + 1]);
}
int main() {
    FILE *in = fopen("arbint.in", "r"), *out;
    fscanf(in, "%d %d\n", &n, &m);

    for(int i = 1; i <= n; ++i) {
        fscanf(in, "%d ", v + i);
    }

    build(1, 1, n);
    
    out = fopen("arbint.out", "w");
    while(m--) {
        int a, b, c;
        fscanf(in, "%d %d %d\n", &a, &b, &c);
        if(a == 0) {
            fprintf(out, "%d\n", query(1, 1, n, b, c));
        } else {
            update(1, 1, n, b, c);
        }
    }

    fclose(in);
    fclose(out);
}