Cod sursa(job #573507)

Utilizator andrey932Andrei andrey932 Data 6 aprilie 2011 12:36:32
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n,m,a[100005],rmq[100005][20],k,i,j,x,y,p;

void preg_rmq() {
    for(i=1;i<=n;i++) {
        rmq[i][0]=i;
    }
    for(j=1; (1<<j)<=n;j++) {
        for(i=1;i<=n;i++) {
            if (a[ rmq[i][j-1] ] < a[ rmq[i+(1<<(j-1))-1][j-1] ])
                rmq[i][j]=rmq[i][j-1];
            else
                rmq[i][j]=rmq[i+(1<<(j-1))-1][j-1];
        }
    }
}

int query(int x, int y) {
k=(int) log(y-x);
p=pow((double)2,k);
if (a[ rmq[x][k] ]<a[ rmq[x+p+1][p] ]) return rmq[x][k];
return rmq[x+p+1][p];
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++) {
        fin>>a[i];
    }

    preg_rmq();
    for(i=1;i<=m;i++) {
        fin>>x>>y;
        fout<<a[query(x,y)]<<"\n";
    }

    fout.close();
    return 0;
}