Cod sursa(job #157515)

Utilizator igorPirnau Igor igor Data 13 martie 2008 02:44:18
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream.h>

#define nmax 100000
#define vmax 150000

ofstream g("rmq.out");

int c[vmax][20], n, m, a[vmax]; 
char put[vmax];

int min(int x, int y)
{
    if( x > y ) return y;
    return x;
}
         
void afla_c()
{
    int i, j;
    
    for(i=1; i<=n; i++)   c[i][0]=a[i];
    
    for(j=1; j<=put[n]; j++)
        for(i=1; i<=n; i++) c[i][j] = min( c[i][j-1], c[ i+(1<<(j-1)) ][ j-1 ] );
}

void afla_p()
{
    int nr=0, i, con;
    for(i=2; i<=nmax; i<<=1) put[i] = ++nr;

    con=1;
    for(i=3; i<=nmax; i++) if( con > put[i] ) put[i]=con;
                                else con++;
} 
 
void citire()
{
    int i, sol, p, x, y, j;
    
    ifstream f("rmq.in");
    f>>n>>m;
    
    for(i=1; i<=n; i++) f>>a[i];
    
    afla_p();
    afla_c();

    for(i=1; i<=m; i++){
        f>>x>>y;
        p = put[y-x+1];
        sol = min ( c[x][p], c[y-(1<<p)+1][p]);
        g<<sol<<'\n';
    }
}    
   
int main()
{
    citire();
    g.close();
    return 0;
}