Cod sursa(job #2600559)

Utilizator k2e0e0w3qDumitrescu Gheorghe k2e0e0w3q Data 12 aprilie 2020 20:20:07
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#define N 1<<18
#define log(x) 31-__builtin_clz(x)
#define max(a,b) a>b?a:b

int n, segtree[N];
void update (int i, int x) {
    i+=n-1; // frunza
    segtree[i]=x;
    while (i>>=1)
        segtree[i]=max(segtree[i<<1], segtree[(i<<1)+1]);
}

int query (int l, int r) {
    l+=n-1;
    r+=n-1;
    int ans=0;
    while (l<=r) {
        if (l&1) {
            ans=max(ans, segtree[l]);
            ++l;
        }
        if (!(r&1)) {
            ans=max(ans, segtree[r]);
            --r;
        }
        l>>=1;
        r>>=1;
    }
    return ans;
}

int main (void) {
    FILE *fin=fopen("arbint.in", "r"),
         *fout=fopen("arbint.out", "w");
    int save, q, i, key, x, y;
    fscanf(fin, "%d%d", &n, &q);

    save=n;
    if (n&(n-1)) // daca n nu e putere de 2
        n=1<<log(n)+1; // rotunjesc la urmatoarea putere
    for (i=1; i<=save; i++) {
        fscanf(fin, "%d", &x);
        update(i, x);
    }
    for (; q; q--) {
        fscanf(fin, "%d%d%d", &key, &x, &y);
        if (key)
            update(x, y);
        else
            fprintf(fout, "%d\n", query(x, y));
    }
    return 0;
}