Cod sursa(job #1172886)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 18 aprilie 2014 11:07:26
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <cstdio>

using namespace std;
int n, m, p, i, j, x, y, lg[100005], v[100005], a[100005][20];
int min(int x, int y)
{
    if(x>=y) return y;
    return x;
}
int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i=1;i<=n;i++)
        scanf("%d", &v[i]);
    p=1;
    for(i=1;i<=n;i++)
    {
        //for(j=0;(1<<j)<=i;j++);
        //lg[i]=j-1;
        if((1<<p)>i) lg[i]=p-1;
        else
        {
            ++p;
            lg[i]=p-1;
        }
    }
    for(i=n;i>=1;i--)
    {
        a[i][0]=v[i];
        for(j=1;j<=lg[n+1-i];j++)
            a[i][j]=min(a[i][j-1], a[i+(1<<(j-1))][j-1]);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d", &x, &y);
        printf("%d\n", min(a[x][lg[y-x+1]], a[y-(1<<(lg[y-x+1]))+1][lg[y-x+1]]));
    }
    return 0;
}