Cod sursa(job #1491811)

Utilizator aaron72Armand Ioan Anusca Popa aaron72 Data 26 septembrie 2015 10:32:41
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int P2[nmax],a[nmax],rmq[17][nmax];
int n,m;

void Build_P2()
{
    P2[1] = 0;
    for(int i = 2;i<=n;i++)
        P2[i] = 1+P2[i/2];
}

void Build_RMQ()
{
    int i,P,j,putere,d2;
    for(i=1;i<=n;i++)
        rmq[0][i] = a[i];
    P = P2[n];
    for(i=1;i<=P;i++)
    {
        putere = (1<<i);
        d2 = (1<<(i-1));
        for(j=1;j<=n-putere+1;j++)
            rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j+d2]);
    }
}


int main()
{
    int i,x,y,L,sol;
    fin>>n>>m;
    for(i=1;i<=n;i++) fin>>a[i];
    Build_P2();
    Build_RMQ();
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        if(x>y) swap(x,y);
        L = (y-x)+1;
        L = P2[L];
        sol = min(rmq[L][x],rmq[L][y-L]);
        fout<<sol<<"\n";
    }

    fout.close();
    return 0;
}