Cod sursa(job #1811780)

Utilizator alexandru822Bosinta Alexandru alexandru822 Data 21 noiembrie 2016 16:31:30
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;
ofstream out("rmq.out");
ifstream in("rmq.in");
const int N_MAX = 100000;
int v[1 + 5*N_MAX];
int n;
int min(int a, int b)
{
    if(a==0) return b;
    if(b==0) return a;
    return (a<b)?a:b;
}
int vec[22][5*N_MAX];

int po2(int x)
{
    if(x==0) return 1;
    if(x%2==1) return 2*po2(x-1);
    if(x%2==0){int a2 = po2(x/2); return a2*a2;}
}

int log2(int n)
{
    int i;
    for(i=2; n/i>=1; i++);
    i--;
    return i;
}

void calc()
{
    int cap = log2(n);
    for(int j=1; j<=n; j++)
        vec[1][j] = min(v[j],v[j+1]);
    for(int j=2; j<=cap; j++)
    {
        int r = po2(j-1);
        for(int k=1; k <= n-r+1; k++)
        {
            vec[j][k] = min(vec[j-1][k], vec[j-1][k+r]);
        }
    }
}
int rmq(int p, int q)
{
    int i, l;
    int t = q - p + 1;
    for(i=1, l=0; i<=t; i*=2, l++);
    i/=2; l--;
    return min(vec[l][p], vec[l][q-i+1]);
}

int main()
{
    int m;
    in >> n >> m;
    for(int i=1; i<=n; i++)
        in >> v[i];
    calc();
    for(int i=1; i<=m; i++)
    {
        int p,q;
        in >> p >> q;
        out << rmq(p,q) << "\n";
    }

    return 0;
}