Cod sursa(job #1679626)

Utilizator rocandu16Badulescu Dan Andrei rocandu16 Data 8 aprilie 2016 09:29:46
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#define MAX 100001
using namespace std;
int r[MAX][20], log[MAX],v[MAX],n,m;
int min(int a, int b)
{
    if(a<b)
        return a;
    else
        return b;
}
void generare()
{

    for(int i=1; i<=n; i++)
    {
        r[i][0]=v[i];
        for(int j=1; (1<<j)<=i; j++)
        {
            r[i][j]=min(r[i][j-1],r[i-(1<<(j-1))][j-1]);
        }
    }
    for(int i=2; i<=n; i++)
        log[i]=1+log[i/2];
}
int rez(int x, int y)
{
    int rasp,l;
    l=log[y-x+1];
    rasp=min(r[y][l],r[x+(1<<l)-1][l]);
    return rasp;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("rmq.in","r");
    fout=fopen("rmq.out","w");
    fscanf(fin,"%d%d",&n,&m);
    for(int i=1; i<=n; i++)
    {
        fscanf(fin,"%d",&v[i]);
    }
    generare();
    int x,y;
    for(int i=1; i<=m; i++)
    {
        fscanf(fin,"%d%d",&x,&y);
        fprintf(fout,"%d\n",rez(x,y));
    }

    /*for(int i=1; i<=n; i++)
    {
        fprintf(fout,"\n");
        for(int j=0; (1<<j)<=i; j++)
        {
            fprintf(fout,"%d ",r[i][j]);
        }
    }*/
    return 0;
}