Cod sursa(job #977379)
Utilizator | Data | 25 iulie 2013 19:33:37 | |
---|---|---|---|
Problema | Range minimum query | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 4.29 kb |
#include <iostream>
#include <fstream>
using namespace std;
int i,n,m,x,y,v[20][100005];
int main(void)
{
FILE * f;
f=fopen("rmq.in","r");
ofstream g("rmq.out");
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=n;i++)
fscanf(f,"%d",&v[0][i]);
for (i=1;i<=n-1;i++)
v[1][i]=min(v[0][i],v[0][i+1]);
for (i=1;i<=n-3;i++)
v[2][i]=min(v[1][i],v[1][i+2]);
for (i=1;i<=n-7;i++)
v[3][i]=min(v[2][i],v[2][i+4]);
for (i=1;i<=n-15;i++)
v[4][i]=min(v[3][i],v[3][i+8]);
for (i=1;i<=n-31;i++)
v[5][i]=min(v[4][i],v[4][i+16]);
for (i=1;i<=n-63;i++)
v[6][i]=min(v[5][i],v[5][i+32]);
for (i=1;i<=n-127;i++)
v[7][i]=min(v[6][i],v[6][i+64]);
for (i=1;i<=n-255;i++)
v[8][i]=min(v[7][i],v[7][i+128]);
for (i=1;i<=n-511;i++)
v[9][i]=min(v[8][i],v[8][i+256]);
for (i=1;i<=n-1023;i++)
v[10][i]=min(v[9][i],v[9][i+512]);
for (i=1;i<=n-2047;i++)
v[11][i]=min(v[10][i],v[10][i+1024]);
for (i=1;i<=n-4095;i++)
v[12][i]=min(v[11][i],v[11][i+2048]);
for (i=1;i<=n-8191;i++)
v[13][i]=min(v[12][i],v[12][i+4096]);
for (i=1;i<=n-16383;i++)
v[14][i]=min(v[13][i],v[13][i+8192]);
for (i=1;i<=n-32767;i++)
v[15][i]=min(v[14][i],v[14][i+16384]);
for (i=1;i<=n-65535;i++)
v[16][i]=min(v[15][i],v[15][i+32768]);
for (i=1;i<=m;i++)
{
fscanf(f,"%d%d",&x,&y);
if (y-x>=65535)
g<<min(v[16][x],v[16][y-65535]);
else
if (y-x>=32767)
g<<min(v[15][x],v[15][y-32767]);
else
if (y-x>=16383)
g<<min(v[14][x],v[14][y-16383]);
else
if (y-x>=8191)
g<<min(v[13][x],v[13][y-8191]);
else
if (y-x>=4095)
g<<min(v[12][x],v[12][y-4095]);
else
if (y-x>=2047)
g<<min(v[11][x],v[11][y-2047]);
else
if (y-x>=1023)
g<<min(v[10][x],v[10][y-1023]);
else
if (y-x>=511)
g<<min(v[9][x],v[9][y-511]);
else
if (y-x>=255)
g<<min(v[8][x],v[8][y-255]);
else
if (y-x>=127)
g<<min(v[7][x],v[7][y-127]);
else
if (y-x>=63)
g<<min(v[6][x],v[6][y-63]);
else
if (y-x>=31)
g<<min(v[5][x],v[5][y-31]);
else
if (y-x>=15)
g<<min(v[4][x],v[4][y-15]);
else
if (y-x>=7)
g<<min(v[3][x],v[3][y-7]);
else
if (y-x>=3)
g<<min(v[2][x],v[2][y-3]);
else
if (y-x>=1)
g<<min(v[1][x],v[1][y-1]);
else
g<<min(v[0][x],v[0][y]);
g<<'\n';
}
g.close();
return 0;
}