Cod sursa(job #1179427)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 28 aprilie 2014 18:24:25
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<fstream>
using namespace std;

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

int n,q,a[100005],mat[100005][20],puteri[25],pos;
short logaritm[100005];
char s[100];

inline void Citire()
{
    int i,j;
    fin>>n>>q;
    for (i=1;i<=n;i++)
        {
            fin>>s;
            j=0;
            while (s[j])
                {
                    a[i]=a[i]*10+(s[j]-'0');
                    j++;
                }
        }
}

inline void Init()
{
    int i;
    logaritm[2]=1;
    for (i=3;i<=n;i++)
        logaritm[i]=logaritm[i>>1]+1;
    puteri[0]=1;
    puteri[1]=2;
    for (i=2;i<=20;i++)
        puteri[i]=puteri[i-1]<<1;
}

inline void DP()
{
    int i,j,aux,putere,st,dr;
    mat[n][0]=a[n];
    for (i=n-1;i>=1;i--)
        {
            mat[i][0]=min(a[i],a[i+1]);
            aux=n-i+1;
            putere=2;
            while (putere<=aux)
                {
                    mat[i][logaritm[putere]]=min(mat[i][logaritm[putere]-1],mat[i+puteri[logaritm[putere]-1]][logaritm[putere]-1]);
                    putere<<=1;
                }
        }
    for (i=1;i<=q;i++)
        {
            fin>>s;st=dr=j=0;
            while (s[j])
                {
                    st=st*10+(s[j]-'0');
                    j++;
                }
            fin>>s;j=0;
            while (s[j])
                {
                    dr=dr*10+(s[j]-'0');
                    j++;
                }
            aux=dr-st;
            if (st==dr) fout<<a[st];
            else fout<<min(mat[st][logaritm[aux]],mat[dr-puteri[logaritm[aux]]][logaritm[aux]]);
            fout<<"\n";
        }
}

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