Cod sursa(job #1714705)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 9 iunie 2016 09:54:50
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
///Nrx imi va datora un suc
#include <bits/stdc++.h>
using namespace std;

int v[17][100005], p[100005];
int n;

void build(int n) {
    int t;

    for(int i=1; i<=n; i<<=1)
        ++p[i];
    for(int i=1; i<=n; ++i)
        p[i]+=p[i-1];

    for(int i=2; i<=16; ++i) {
        v[i][0] = 2e9;
        for(int j=1; j<=min(n, 1<<i-1); ++j)
            v[i][j] = min(v[1][j], v[i][j-1]);
        for(int j=(1<<i-1)+1; j<=n; ++j)
            v[i][j] = min(v[i-1][j], v[i-1][j-(1<<i-2)]);
    }
}

inline int query(int x, int y) {
    int step = p[y-x];
    return min(v[step][y], v[step][x+(1<<step-1)-1]);
}

int main(void) {
    FILE *fi = fopen("rmq.in", "r");
    FILE *fo = fopen("rmq.out", "w");
    int m, x, y;

    fscanf(fi,"%d %d",&n,&m);
    for(int i=1; i<=n; ++i) {
        fscanf(fi,"%d",&v[1][i]);
    }
    build(n);

    for(int i=1; i<=m; ++i) {
        fscanf(fi,"%d%d",&x,&y);
        fprintf(fo,"%d\n",query(x, y));
    }
    fclose(fi);
    fclose(fo);
    return 0;
}