Cod sursa(job #2632376)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 3 iulie 2020 08:38:19
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.78 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout("rmq.out");
int n,q,a[18][100002],put[100002],doi[20];

void precalculare ()
{
    int k=1,nr=2;
    while (nr<=n)
    {
        for (int i=1;i<=n-nr+1;i++)
            a[k][i]=min(a[k-1][i],a[k-1][i+nr/2]);
        nr*=2;
        k++;
    }
}


int main()
{
    fin>>n>>q;
    for (int i=1;i<=n;++i)
        fin>>a[0][i];
    precalculare ();
    int x,y,nr=1,k=0;
    doi[0]=1;
    for (int i=1;i<=n;i++)
      {
        if (nr*2==i)
        {
            nr*=2,++k;
            doi[k]=nr;
        }
        put[i]=k;
        }
    for(;q>0;q--)
    {
        fin>>x>>y;
        fout<<min(a[put[y-x+1]][x],a[put[y-x+1]][y-doi[put[y-x+1]]+1])<<'\n';
    }
    return 0;
}