Cod sursa(job #1515764)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 2 noiembrie 2015 09:48:14
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>

int v[100001];
int a[18][100001];///a[i][j]=costul minim pt secventa care incepe la j si are lg 2^i
int n,m;
int lg[100001];

int min(int a, int b)
{
    if (a < b)
        return a;
    else
        return b;
}

void construct()
{
    int i,j;

    for (i=1; i<=n; i++)
        a[0][i]=v[i];

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

void precalc()
{
    int i;

    lg[1]=0;
    for (i=2; i<=n; i++)
        if (i % 2)
            lg[i]=lg[i/2];
        else
            lg[i]=lg[i/2]+1;
}

int main()
{
    FILE *f,*f2;
    int i,x,y,aux,ans;

    f=fopen("rmq.in","r");
    f2=fopen("rmq.out","w");
    fscanf(f,"%d%d",&n,&m);
    for (i=1; i<=n; i++)
        fscanf(f,"%d",&v[i]);

    construct();
    precalc();

    for (i=1; i<=m; i++)
    {
        fscanf(f,"%d%d",&x,&y);
        aux=lg[y-x+1];
        ans=min(a[aux][x],a[aux][y-(1 << aux) + 1]);
        fprintf(f2,"%d\n",ans);
    }

    fclose(f);
    fclose(f2);
}