Cod sursa(job #1076338)

Utilizator Iustin_BulimarFMI Iustin Bulimar Iustin_Bulimar Data 10 ianuarie 2014 01:37:55
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");

const int n_max=100001;
const int log_n_max=17;

int n, q, i, v[n_max], rm[log_n_max][n_max], x, y;

void rmq(int v[], int n)
{
    int i, j;
    for(j=1; j<=n; j++) rm[0][j]=j;
    for(i=1; (1<<i)<=n; i++)
        for(j=1; j+(1<<i)-1<=n; j++)
            if(v[rm[i-1][j]] < v[rm[i-1][j+(1<<(i-1))]])
                rm[i][j]=rm[i-1][j];
            else
                rm[i][j]=rm[i-1][j+(1<<(i-1))];
}

int query(int v[], int x, int y)
{
    int k=log2(y-x+1);
    if(v[rm[k][x]] < v[rm[k][y-(1<<k)+1]])
        return rm[k][x];
    return rm[k][y-(1<<k)+1];
}

int main()
{
    cin>>n>>q;
    for(i=1; i<=n; i++) cin>>v[i];
    rmq(v, n);
    while(q--)
    {
        cin>>x>>y;
        cout<<v[query(v, x, y)]<<'\n';
    }
    return 0;
}