Cod sursa(job #977379)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 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;
}