Cod sursa(job #2403911)

Utilizator alexoloieriAlexandru Oloieri alexoloieri Data 12 aprilie 2019 01:41:22
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <cmath>
#define NMAX 100005
#define NMAX2 18
using namespace std;
FILE *fin=fopen("rmq.in","r");
FILE *fout=fopen("rmq.out","w");
int rmq[NMAX][NMAX2];
int a[NMAX];
int n, m;
int l, r;
int l2(int x)
{
    int ans = 0;
    int act = 1;
    if (x<=1)
        return 0;
    while (1)
    {
        if (act > x)
            return ans-1;
        ++ans, act*=2;
    }
}
int main()
{
    fscanf(fin,"%d %d",&n,&m);
    for (int i=1;i<=n;++i)
    {
        fscanf(fin,"%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];
            }
        }
    }
    int lg = l2(n);
    for (int i=1;i<=m;++i)
    {
        fscanf(fin,"%d %d",&l,&r);
        int dist = r-l+1;
        int wh = l2(dist);
        int ans = a[rmq[l][wh]];
        int ac = dist - (1<<wh);
        if (a[rmq[l+ac][wh]] < ans)
        {
            ans = a[rmq[l+ac][wh]];
        }
        fprintf(fout,"%d\n", ans);
    }
    return 0;
}