Cod sursa(job #388882)

Utilizator alexandru92alexandru alexandru92 Data 31 ianuarie 2010 12:22:21
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on January 31, 2010, 9:40 AM
 */
#include <fstream>
#define NMax 100001
#define inf 0x3f3f3f3f

/*
 *
 */
using namespace std;
int N;
int v[NMax], tree[NMax];
inline int min( int x, int y )
{
    return ( v[x] < v[y] ? x : y );
}
int Query( int x, int y )
{int maxim=0, idx1, idx2;
    for( idx1=y-( y & -y ); x <= y; y=idx1, idx1-=( idx1 & -idx1 )  )
    {
        if( idx1 >= x )
            idx2=tree[y];
        else idx1=y-1, idx2=idx1+1;
        maxim=min( idx2, maxim );
    }
    return maxim;
}
void Update( int x )
{
    for( int z=x; z <= N; z+=( z & -z ) )
        if( x == tree[z] )
          tree[z]=min( z, Query( z-( z & -z )+1 , z-1 ) );
        else tree[z]=min( tree[z], x );
}
int main()
{int m, i, y, z;
    ifstream in("rmq.in");
    in>>N>>m;
    v[0]=inf;
    for( i=1; i <= N; ++i )
    {
        in>>v[i];
        Update( i );
    }
    ofstream out("rmq.out");
    for( i=1; i <= m; ++i )
    {
        in>>y>>z;
        out<<v[ Query( y, z ) ]<<'\n';
    }
    return 0;
}