Cod sursa(job #3146384)

Utilizator ecaterinaEcaterina Stefanescu ecaterina Data 20 august 2023 18:55:26
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>

#define NMAX 100002
#define LOGMAX 17

int tabel[NMAX][LOGMAX];
int v[NMAX];
int lg2[NMAX];
int n, lg;

static inline int f(int x, int y) {
    if (x<y) {
        return x;
    }
    return y;
}


void calclg2() {
    int i;
    
    lg2[0] = lg2[1] = 0;
    
    for (i=2; i<=n; i++) {
        lg2[i] = lg2[i/2]+1;
    }
    lg = lg2[n];
}

void build() {
    int i, p;
    for (i=0; i<n; i++) {
        tabel[i][0] = v[i];
    }
    for (p=1; p<=lg; p++) {
        for (i=0; i+(1<<p)-1<n; i++) {
            tabel[i][p] = f(tabel[i][p-1], tabel[i+(1<<(p-1))][p-1]);
        }
    }
}

int query(int st, int dr) {
    int lung, log, rez;
    
    lung = dr-st+1;
    log = lg2[lung];
    
    rez = f(tabel[st][log], tabel[dr-(1<<log)+1][log]);
    return rez;
}

int main() {
    FILE *fin, *fout;
    fin = fopen("rmq.in", "r");
    fout = fopen("rmq.out", "w");
    
    int m, rez, i, a, b;
    
    fscanf(fin, "%d%d", &n, &m);
    for (i=0; i<n; i++) {
        fscanf(fin, "%d", &v[i]);
    }
    
    calclg2();
    build();
    
    for (i=0; i<m; i++) {
        fscanf(fin, "%d%d", &a, &b);
        a--;
        b--;
        rez = query(a, b);
        fprintf(fout, "%d\n", rez);
    }
    
    fclose(fin);
    fclose(fout);
    return 0;
}