Cod sursa(job #1969440)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 18 aprilie 2017 14:27:09
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>

using namespace std;

FILE *f1 = fopen("rmq.in","r");
FILE *f2 = fopen("rmq.out","w");

const int buff_size = 10000;
char buff[buff_size];
int buff_poz;

void citeste(int &x)
{
    x=0;

    while(buff[buff_poz]<'0' || buff[buff_poz]>'9')
        if(++buff_poz == buff_size)
        {
            fread(buff,1,buff_size,f1);
            buff_poz = 0;
        }

    while(buff[buff_poz] >= '0' && buff[buff_poz] <='9')
    {
        x = x*10 + buff[buff_poz] - '0';
        if(++buff_poz == buff_size)
        {
            fread(buff,1,buff_size,f1);
            buff_poz = 0;
        }
    }
}
int min(int a,int b)
{
    if(a<b)
        return a;
    return b;
}

const int N = 100005;
const int LOG = 17;

int n,q,i,j,x,y;
int rmq[LOG][N],log[N];

void build()
{
    for(i=2;i<=n;i++)
        log[i] = log[i/2] + 1;

    for(i=1;(1<<i) <= n;i++)
        for(j=1;j<=n;j++)
            rmq[i][j] = min(rmq[i-1][j] , rmq[i-1][j + (1<<(i-1))]);
}

int query()
{
    int lg,dif;

    lg = log[y-x+1];
    dif = y - (1<<lg) + 1;

    return min(rmq[lg][x] , rmq[lg][dif]);
}

int main()
{
    citeste(n);
    citeste(q);

    for(i=1;i<=n;i++)
        citeste(rmq[0][i]);

    build();

    for(i=0;(1<<i) <= n;i++)
    {
        for(j=1;j<=n;j++)
            printf("%d ",rmq[i][j]);
        printf("\n");
    }

    while(q--)
    {
        citeste(x);
        citeste(y);

        //printf("%d %d\n",x,y);

        fprintf(f2,"%d\n",query());
    }


    return 0;
}