Cod sursa(job #1969432)

Utilizator popescu.octavianPopescu Octavian popescu.octavian Data 18 aprilie 2017 14:23:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <fstream>
#define NMax 100005
#define LgMax 17
using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int N, M, log2[NMax], i, j, RMQ[NMax][LgMax], sol, lg, x, y, v[NMax];
int main()
{
    f>>N>>M;
    for(i=1; i<=N; i++)
    {
        f>>v[i];
        if(i>1) log2[i]=log2[i/2]+1;
        RMQ[i][0]=i;
    }
    for(j=1; (1<<j)<=N; j++)
        for(i=1; i+(1<<j)-1<=N; i++)
        {
            if(v[RMQ[i][j-1]]<=v[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(i=1; i<=M; i++)
    {
        f>>x>>y;
        lg=log2[y-x+1];
        sol=min(v[RMQ[x][lg]],v[RMQ[y-(1<<lg)+1][lg]]);
        g<<sol<<'\n';
    }
    return 0;
}