Mai intai trebuie sa te autentifici.

Cod sursa(job #1118076)

Utilizator dspMihaiDespotovici Mihai dspMihai Data 23 februarie 2014 23:23:05
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#include <fstream>
#define MAX 100001
using namespace std;
 
long maxj,i,j,N,Mnr,sir[MAX],M[MAX][18];
int k,lg[MAX],pw2[20];
 
int minsir (int x, int y)
{
    if (sir[x]<sir[y]) return x;
    else return y;
}
 
int main ()
{
    FILE *g;
    ifstream f("rmq.in");
    g=fopen("rmq.out", "w");
    f>>N>>Mnr;
    for (i=1; i<=N; i++) {f>>sir[i]; M[i][0]=i;}
    lg[1]=0;
    for (i=2; i<=N; i++) lg[i]=lg[i/2]+1;
    pw2[0]=1;
    for (i=1; i<=19; i++) pw2[i]=pw2[i-1]*2;
    maxj=lg[N];
    for (j=1; j<=maxj; j++)
        for (i=1; i+pw2[j]-1<=N; i++)
            M[i][j]=minsir(M[i][j-1], M[i+pw2[j-1]][j-1]);
    for (; Mnr>=1; Mnr--)
    {
        f>>i>>j;
        fprintf(g, "%d\n", sir[minsir(M[i][lg[j-i+1]],M[j-pw2[lg[j-i+1]]+1][lg[j-i+1]])]);
    }   
    f.close(); fclose(g);
    return 0;
}