Cod sursa(job #908616)

Utilizator Ionut228Ionut Calofir Ionut228 Data 9 martie 2013 20:48:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<fstream>
#include<algorithm>
#include<vector>

using namespace std;

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

int n,m,a,x,y,k;
vector < vector<int> > RMQ;
vector<int> logaritm;

void preprocesare ()
{
    int r,l;
    logaritm.push_back(-1);
    logaritm.push_back(0);
    for(int i=2;i<=n;i++)
        logaritm.push_back(logaritm[i/2]+1);
    r=1;
    l=1;
    for(int i=1;i<=logaritm[n];i++)
    {
        for(int j=0;j<n-l;j++)
            RMQ[i].push_back(min(RMQ[i-1][j],RMQ[i-1][j+r]));
        r=r*2;
        l=r+1;
    }
}

int query (int x, int y)
{
    int l,sh,diff;
    diff=y-x+1;
    l=logaritm[diff];
    sh=diff-(1<<l);
    return min(RMQ[l][x],RMQ[l][x+sh]);
}

int main ()
{
    f>>n;
    f>>m;
    RMQ.resize(n);
    for(int i=1;i<=n;i++)
    {
        f>>a;
        RMQ[0].push_back(a);
    }
    preprocesare();
    for(int i=1;i<=m;i++)
    {
        f>>x;
        f>>y;
        x=x-1;
        y=y-1;
        g<<query(x,y)<<"\n";
    }
    f.close();g.close();
    return 0;
}