Cod sursa(job #1914976)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 8 martie 2017 19:12:01
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define INF 0x3f3f3f3f
#define NMAX 100005
using namespace std;

int n, q, a[NMAX], smen[NMAX], sqr;

void citire()
{
    scanf("%d %d ",&n,&q);
    for(int i=0;i<n;i++)
    {
        scanf("%d ",&a[i]);
    }
}

void build_smen()
{
    sqr = (int) sqrt(n);

    fill(smen,smen+sqr+1,INF);

    for(int i=0; i<n; i++)
    {
        smen[i/sqr]=min(smen[i/sqr],a[i]);
    }
}

int query(int i,int j)
{
    int minim = INF;

    for(int bucata=(i+1)/sqr; bucata <= (j-1)/sqr; bucata++)
        minim = min(smen[bucata],minim);

    for(int t=i; t< (i+1)/sqr * sqr;t++)
        minim = min(a[t],minim);

    for(int t=j/sqr * sqr; t<=j;t++)
        minim = min(a[t],minim);


    return minim;
}

void solve()
{
    for(int qq=1;qq<=q;qq++)
    {
        int i, j;
        scanf("%d %d ",&i,&j);
        printf("%d\n",query(i-1,j-1));
    }
}

int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    citire();
    build_smen();
    solve();
    return 0;
}