Cod sursa(job #1543449)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 6 decembrie 2015 10:58:52
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#define MAXN 200005
FILE *f=fopen("rmq.in","r"), *g=fopen("rmq.out","w");

int N, Q, RMQ[MAXN][20], log[MAXN], doi[20], logN;

int Min( int A, int B ){ if(A<B) return A; return B; }

void Citire(){
int i;

    fscanf(f,"%d %d\n",&N,&Q);
    for(i=1;i<=N;i++)
        fscanf(f,"%d",&RMQ[i][0]);

    for(i=2;i<=100000;i++)
        log[i] = log[i/2] + 1;

    logN = log[N];

    doi[0] = 1;
    for(i=1;i<=17;i++)
        doi[i] = doi[i-1] * 2;

}

void CreareRMQ(){
int i, j, l;

    for(j=1;j<=logN;j++){

        l = doi[j];
        for( i = 1; i <= N-l+1; i++ )
            RMQ[i][j] = Min( RMQ[i][j-1], RMQ[ i+ (l/2) ][j-1] );

    }

}

void Rezolvare(){
int q, x, y, logD, doiD, D;

    for(q=1;q<=Q;q++){

        fscanf(f,"%d %d\n",&x,&y);

        D = x-y+1;
        logD = log[D];
        doiD = doi[logD];

        fprintf(g,"%d\n",Min( RMQ[x][logD], RMQ[y-doiD+1][logD] ) );

    }

}

int main(){

    Citire();
    CreareRMQ();
    Rezolvare();

return 0;
}