Cod sursa(job #2339108)

Utilizator aturcsaTurcsa Alexandru aturcsa Data 8 februarie 2019 13:33:13
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n;
int ncol,p;
int A[100001];
int T[100001][15];
int Q;

int query(int st,int dr)
{
    int answer;
    answer=1000000000;
    for (int c=ncol;c>=0;c--)
        if (st+(1<<c)-1<=dr)
        {
            answer=min(answer,T[st][c]);
            st=st+(1<<c);
        }
    return answer;
}

int main()
{
    fin>>n;
    fin>>Q;
    for (int i=1;i<=n;i++)
        fin>>A[i];
    /// se construieste T
    /// care este numarul de ordine al ultimei coloane din T
    p=1;
    ncol=0;
    while (p*2<=n)
    {
        p=p*2;
        ncol++;
    }
    for (int i=1;i<=n;i++)
        T[i][0]=A[i];
    for (int j=1;j<=ncol;j++)
        for (int i=1;i<=n-(1<<j)+1;i++)
            T[i][j]=min(T[i][j-1], T[i+(1<<(j-1))][j-1]);
    /// se raspunde la interogari

    for (int q=1;q<=Q;q++)
    {
        int st,dr;
        fin>>st>>dr;
        fout<<query(st,dr)<<"\n";
    }
    return 0;
}