Cod sursa(job #2136527)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 19 februarie 2018 22:51:23
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define nmax 100005

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

vector<pair<int,int>>queries;


int value[nmax],n,m,logg;
int v[nmax][16];

void read()
{
    f>>n>>m;
    for (int i=1;i<=n;++i)
        f>>value[i];
    for (int i=1;i<=m;++i)
    {
        int a,b;
        f>>a>>b;
        queries.push_back({a,b});
    }
}

int getlogg(int nod)
{
    int temp,calcul=0;
    for (temp=1;temp<=nod;temp<<=1,++calcul);
        return calcul-1;
}

void solve()
{
    logg=getlogg(n);
    for (int i=1;i<=n;++i)
            v[i][0]=i;
    for (int j=1;j<=logg;j<<=1)
        for (int i=1;i+(1<<j)-1<=n;++i)
            if (value[v[i][j-1]]<value[v[i+(1<<(j-1))][j-1]])
                v[i][j]=v[i][j-1];
            else
                v[i][j]=v[i+(1<<(j-1))][j-1];
    for (auto w:queries)
    {
        int x=w.first;
        int y=w.second;
        if (x>y)
            swap(x,y);
        int loga=getlogg(y-x);
        int mn=min(value[v[x][(1<<loga)-1]],value[v[y-(1<<loga)+1][(1<<loga)-1]]);
        g<<mn<<'\n';
    }
}

int main()
{
    read();
    solve();
    return 0;
}