Cod sursa(job #1172883)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 18 aprilie 2014 11:02:24
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 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=0;
    for(i=1;i<=n;i++)
        if((1<<p)>=i) lg[i]=p;
        else
        {
            p++;
            lg[i]=p;
        }
    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]], a[y-(1<<(lg[y-x]))+1][lg[y-x]]));
    }
    return 0;
}