Cod sursa(job #1163383)

Utilizator VisuianMihaiMihai Visuian VisuianMihai Data 1 aprilie 2014 12:36:11
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int rmq[100001][20], a[100001], n, m, x, y, lg[100001];

int main()
{
    fin>>n>>m;
    for(int i = 1; i<= n; i++ )
        fin>>a[i];
    for(int i  =2; i<= n; i++ )
        lg[i]=1+lg[i>>1];
    for(int i = 1; i<= n; i++ )
        rmq[i][0]=i;
    for(int j = 1; (1<<j)<= n; j++ )
        for(int i = 1; i+(1<<j)-1<=n; i++ )
        {
            if(a[rmq[i][j-1]]<a[rmq[i+(1<<(j-1))][j-1]])
                rmq[i][j]=rmq[i][j-1];
            else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
        }
    for(int i = 1; i<= m; i++ )
    {
        fin>>x>>y;
        if(x>y) swap(x,y);
        int l=lg[y-x+1];
        fout<<min(a[rmq[x][l]],a[rmq[y-(1<<l)+1][l]])<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}