Cod sursa(job #1379490)

Utilizator CartofenAndrei Cartof Cartofen Data 6 martie 2015 18:06:04
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
using namespace std;

#define NMax 100005
#define LGMax 18

ifstream f("rmq.in");
ofstream g("rmq.out");

int n,m,lgn;

int RMQ[NMax][LGMax];
int v[NMax];

void build_RMQ()
{
    int x,i,j;
    for(int aux=1;aux<=n;aux<<=1) lgn++;

    for(j=1;j<=lgn;++j) for(i=1;i<=n;++i)
    {
        x = i + (1<<(j-1));
        if(x>n) RMQ[i][j] = RMQ[i][j-1];
        else
        {
            if(v[RMQ[i][j-1]] < v[RMQ[x][j-1]]) RMQ[i][j] = RMQ[i][j-1];
            else RMQ[i][j] = RMQ[x][j-1];
        }
    }
}

int main()
{
    int i,a,b,p;

    f>>n>>m;
    for(i=1;i<=n;++i) f>>v[i], RMQ[i][0] = i;

    build_RMQ();

    while(m--)
    {
        f>>a>>b;
        p = -1;
        for(int aux=1;aux<=b-a+1;aux<<=1) p++;
        g<<min(v[RMQ[a][p]],v[RMQ[b-(1<<p)+1][p]])<<"\n";
    }

    f.close();
    g.close();
    return 0;
}