Cod sursa(job #1915160)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 8 martie 2017 19:58:27
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>
#include <cmath>
#define NMAX 100005
#define min(x,y) ((x<y)?(x):(y))
using namespace std;

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

void citire()
{
    scanf("%d %d ",&n,&q);

    sqr = (int) sqrt(n);

    for(int i=0;i<n;i++)
    {
        scanf("%d ",&a[i]);
        smen[i/sqr]= ((i%sqr==0) ? a[i] : min(smen[i/sqr],a[i]));
    }
}

int query(int st,int dr)
{
    int i=0;
    for (; i < st; i += sqr);

    int cm = a[st];

    for (int j = st; j < i; j++)
        cm = min(cm, a[j]);

    for (;i+sqr < dr; i += sqr)
        cm = min(cm, smen[i/sqr]);

    for (int j = i; j <= dr; j++)
        cm = min(cm, a[j]);
    return cm;
}

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

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