Cod sursa(job #2882371)

Utilizator PescaPescariu Matei Alexandru Pesca Data 31 martie 2022 13:08:58
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n;
int const N=100005;
int const J=log2(N)+3;
int a[N][J];
int p2[J];
void build()
{
    p2[0]=1;
    for(int i=1;i<=J;i++)
        p2[i]=p2[i-1]*2;
    int power=1;
    for(int j=1;j<=J;j++)
    {
        for(int i=1;i<=N;i++)
            if(i+power<=n)
                a[i][j]=min(a[i][j-1],a[i+power][j-1]);
            else
                break;
        power*=2;
    }
}
int main()
{
    int q;
    fin>>n>>q;
    for(int i=1;i<=n;i++)
        fin>>a[i][0];
    build();
    while(q--)
    {
        int x,y;
        fin>>x>>y;
        if(x>y)
            swap(x,y);
        int val=log2(y-x+1);
        fout<<min(a[x][val],a[y-p2[val]+1][val])<<'\n';
    }
}