Cod sursa(job #2819137)

Utilizator ecaterinaEcaterina Stefanescu ecaterina Data 17 decembrie 2021 21:52:01
Problema Range minimum query Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>

#define MAXN 100001
#define MAXLOG 16

int v[MAXN];
int a[MAXN][MAXLOG+1];
int vlog2[MAXN];

void precalclog(int n) {
    int i;
    vlog2[1] = 0;
    for (i=2; i<=n; i++) {
        vlog2[i] = vlog2[i/2]+1;
    }
}

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

void build(int n) {
    int i, p;
    
    for (i=0; i<n; i++) {
        a[i][0] = v[i];
    }
    
    for (p=1; p<=MAXLOG; p++) {
        for (i=0; i+(1<<p)-1 < n; i++) {
            a[i][p] = minim(a[i][p-1], a[i+(1<<(p-1))][p-1]);
        }
    }
}

int query(int st, int dr) {
    int lung, log;
    
    lung = st-dr+1;
    log = vlog2[lung];
    
    return minim(a[st][log], a[dr-(1<<log)+1][log]);
}

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