Cod sursa(job #965097)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 23 iunie 2013 13:07:37
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>

#define In "rmq.in"
#define Out "rmq.out"
#define Nmax 100100
#define Lim 50000
#define Next (++pos==Lim)?(f.read(Buffer,Lim),pos = 0):0
#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

int log2[Nmax],dp[Nmax][18], pos;
///dp[i][j] = minumul din intervalul [i,i+2^j-1]
char Buffer[Lim];

ifstream f(In);
ofstream g(Out);

inline void Read(int &x)
{
    while(Buffer[pos]<'0' || '9'<Buffer[pos])
        Next;
    x = 0;
    while('0'<=Buffer[pos] && Buffer[pos]<='9')
    {
        x = x*10 +Buffer[pos]-'0';
        Next;
    }
}

int main()
{
    int N, X, Y,M, i, j, d, log;
    f.read(Buffer,Lim);
    Read(N);Read(M);
    for(i = 1 ;i <= N ;++i)
        Read(dp[i][0]);
    for(i = 2;i <= N; ++i)
        log2[i] = log2[i>>1]+1;

    for(j = 1;(1<<j)<=N; ++j)
        for(i = 1;i <= N - (1 << (j-1)); ++i)
            dp[i][j] = min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);

    while(M--)
    {
        Read(X);Read(Y);
        d = Y-X+1;
        log = log2[d];
        g<<min(dp[X][log],dp[X+d-(1<<log)][log])<<"\n";
    }
    f.close();
    g.close();
    return 0;
}