Cod sursa(job #1357881)

Utilizator Checiu-ElizaCheciu Alexandra Checiu-Eliza Data 24 februarie 2015 10:23:18
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
using namespace std;
const int nmax=100001,logmax=18;

int A[nmax],D[nmax][logmax],N,Q,Log[nmax];

void constr() {
    Log[1]=0;
    for (int i=2;i<=N;i++)
        Log[i]=Log[i/2]+1;
    for (int i=0;i<N;i++)
        D[i][0]=i;
    for (int j=1;(1<<j)<=N;j++)
        for (int i=0;i+(1<<j)-1<N;i++)
            if (A[D[i][j-1]]<A[D[i+(1<<(j-1))][j-1]]) D[i][j] = D[i][j-1];
            else D[i][j]=D[i+(1<<(j-1))][j-1];
}
int query(int i, int j) {
    int k=Log[j-i+1];
    if (A[D[i][k]]<=A[D[j-(1<<k)+1][k]]) return D[i][k];
    else return D[j-(1<<k)+1][k];
}

int main () {
    FILE *in = fopen("rmq.in", "r"), *out = fopen("rmq.out", "w");
    if (in && out) {
        fscanf(in, "%d %d\n", &N, &Q);
        for (int i = 0; i < N; i++)
            fscanf(in, "%d\n", A + i);
        constr();
        int x, y;
        for (int i=0;i<Q;i++) {
            fscanf(in, "%d %d\n", &x, &y);
            fprintf(out, "%d\n", A[query(x-1,y-1)]);
        }
        fclose(in);
        fclose(out);
    }
    return 0;
}