Cod sursa(job #2019993)

Utilizator DavidLDavid Lauran DavidL Data 9 septembrie 2017 09:38:39
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#define MAX 100005
using namespace std;
ifstream fi("rmq.in");
ofstream fo("rmq.out");

int a[MAX],minim[MAX][20],n,m;
///minim[x][p]=minimul de la pozitia x la x+2^p

void precalculare()
{
    for (int x=1; x<n; x++)
        minim[x][0]=min(a[x],a[x+1]);
    for (int p=1; (1<<p)<=n; p++)
        for (int x=1; x+(1<<p)<=n; x++)
            minim[x][p]=min(minim[x][p-1],
                            minim[x+(1<<(p-1))][p-1]);
}

int main()
{
    fi>>n>>m;
    for (int i=1; i<=n; i++)
        fi>>a[i];
    precalculare();
    /*for (int i=1; i<=n; i++)
        for (int p=0; i+(1<<p)<=n; p++)
    {
        fo<<"Minimul de la "<<i<<" la "<<i+(1<<p)<<" este ";
        fo<<minim[i][p]<<"\n";
    }*/
    for (int i=1; i<=m; i++)
    {
        int x,y;
        fi>>x>>y;
        if (x==y)
        {fo<<a[x]<<"\n"; continue;}
        int p=0;
        while (x+(1<<(p+1))<=y)
            p++;
        int rez=min(minim[x][p],
                    minim[y-(1<<p)][p]);
        fo<<rez<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}