Cod sursa(job #2419985)

Utilizator alexoloieriAlexandru Oloieri alexoloieri Data 10 mai 2019 00:13:23
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
int a[nmax], rmq[nmax][25];
int n, m, x, y;
int dist, add, og2;
int l2(int x)
{
    if (x<=1) return 0;
    int ans = 0, p2 = 1;
    while(true)
    {
        if (p2>x) return ans-1;
        ++ans, p2*=2;
    }
}
int main()
{
    scanf("%d %d",&n,&m);
    for (int i=1;i<=n;++i)
        scanf("%d",&a[i]);
    for (int i=1;i<=n;++i)
        rmq[i][0] = i;
    for (int j=1;(1<<j)<=n;++j)
        for (int i=1;i+(1<<j)-1<=n;++i)
            if (a[rmq[i][j-1]] < a[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 (int i=1;i<=m;++i)
    {
        scanf("%d %d",&x,&y);
        if (x > y) swap(x,y);
        dist = y - x + 1;
        og2 = l2(dist);
        add = dist - (1<<og2);
        if (a[rmq[x][og2]] < a[rmq[x+add][og2]])
            printf("%d\n",a[rmq[x][og2]]);
        else
            printf("%d\n",a[rmq[x+add][og2]]);
    }
    return 0;
}