Cod sursa(job #1184990)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 14 mai 2014 19:22:45
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<fstream>
#define Next (++pos==Lim)?(fin.read(Buffer,Lim),pos = 0):0
using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

const int Nmax=100005;
const int Lim=50000;

int n,q,a[Nmax],mat[Nmax][20],pos;
short logaritm[Nmax];
char Buffer[Lim];

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;
    }
}

inline void Citire()
{
    int i;
    fin.read(Buffer,Lim);
    Read(n);Read(q);
    for (i=1;i<=n;i++)
        Read(mat[i][0]);
}

inline void DP()
{
    int i,j,st,aux,dr;
    for (i=2;i<=n;i++)
        logaritm[i]=logaritm[i>>1]+1;
    for (j=1;(1<<j)<=n;j++)
        for (i=1;i<=n-(1<<j)+1;i++)
            mat[i][j]=min(mat[i][j-1],mat[i+(1<<(j-1))][j-1]);
    for (i=1;i<=q;i++)
        {
            Read(st);Read(dr);
            aux=dr-st+1;
            fout<<min(mat[st][logaritm[aux]],mat[dr-(1<<(logaritm[aux]))+1][logaritm[aux]]);
            fout<<"\n";
        }
}

int main()
{
    Citire();
    DP();
    return 0;
}