Cod sursa(job #2447426)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 13 august 2019 12:48:06
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n, m, v[100003][50], log[100003], a[1001];

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        fin>>a[i];
        v[i][0]=i;
        //fout<<i<<" "<<i<<" "<<v[i][0]<<"\n";
    }
    for(int j=1;(1<<j)<=n;++j)
        for(int i=1;i+(1<<j)-1<=n;++i)
        {
            if(a[v[i][j-1]]<a[v[i+(1<<(j-1))][j-1]]) v[i][j]=v[i][j-1];
            else v[i][j]=v[i+(1<<(j-1))][j-1];
            //fout<<i<<" "<<i+(1<<j)-1<<" "<<v[i][j]<<" "<<v[v[i][j]][0]<<"\n";
        }
    int j=0;
    for(int i=1;i<=n;++i)
    {
        if(i>=(1<<(j+1))) j++;
        log[i]=j;
    }
    for(int i=1;i<=m;++i)
    {
        int x, y;
        fin>>x>>y;
        int k=log[y-x+1];
        fout<<min(a[v[x][k]], a[v[y-(1<<k)+1][k]])<<"\n";
    }
    return 0;
}