Cod sursa(job #1319648)

Utilizator Lucian_BosinceanuLucian-Andrei Bosinceanu Lucian_Bosinceanu Data 17 ianuarie 2015 11:58:02
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>
#include <cmath>
#define DMAX 100005

using namespace std;

FILE*fin=fopen("rmq.in","r");
FILE*fout=fopen("rmq.out","w");

void citire();
void fa_p2();
void fa_RMQ();
void rezolvare();

int n,m,logn;
int rmq[DMAX][15];
int v[DMAX];
int min(int a,int b);
int p2[20];

int main()
{
citire();
fa_p2();
fa_RMQ();
rezolvare();
    return 0;
}

void citire()
{
int i;
fscanf(fin,"%d %d",&n,&m);
for (i=1;i<=n;i++) fscanf(fin,"%d",&v[i]);
}

void fa_p2()
{
int i;
p2[0]=1;
for (i=1;i<=n && p2[i-1]<=n;i++)
    {p2[i]=1<<i;
     logn=i;
    }
}

void fa_RMQ()
{
int i,j;
for (i=1;i<=n;i++) rmq[i][0]=v[i];
for (j=1;j<=logn;j++)
     for (i=1;i<=n;i++)
          rmq[i][j]=min( rmq[i][j-1], rmq[i-p2[j-1]][j-1] );
}

void rezolvare()
{
int i,st,dr;
for (i=1;i<=m;i++)
    {
     fscanf(fin,"%d %d",&st,&dr);
    }
}

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