Cod sursa(job #2543748)

Utilizator qThunderStefan Durlanescu qThunder Data 11 februarie 2020 14:45:47
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.77 kb
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int d[20][100004],l[100004],x,y,n,m,mx;
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>d[0][i];
        mx=max(mx,d[0][i]);
    }
    for(int i=2;i<=mx;i++)
    {
        l[i]=l[i/2]+1;
    }
    int t=1;
    int k=l[n];
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<=n;j++)
        {
            d[i][j]=d[i-1][j];
            if(j+t<=n && d[i][j]>d[i-1][j+t])
                d[i][j]=d[i-1][j+t];
           // fout<<d[i][j]<<" ";
        }
        t*=2;
       // fout<<"\n";
    }
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        t=l[y-x+1];
        fout<<min(d[t][x],d[t][y-(1<<t)+1])<<"\n";
    }
    return 0;
}