Cod sursa(job #915970)

Utilizator PatrikStepan Patrik Patrik Data 15 martie 2013 17:10:18
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define MAX 100001
    int N , M[MAX][20] ,  V[MAX] , K , log[MAX];

    int main()
    {
        freopen("rmq.in" , "r" , stdin );
        freopen("rmq.out" , "w" , stdout );
        scanf("%d%d" , &N  , &K);
        for( int i = 1 ; i <=N ; ++i )
            scanf("%d" , &V[i] );

        for(int i = 2 ; i <= N ; ++i )
            log[i] = log[i/2]+1;

        for(int i = 1 ; i <= N ; ++i )
            M[i][0] = i;
        for(int j = 1 ; 1 <<j <= N ; ++j )
            for( int i = 1 ; i + (1<<j)-1 <= N ; ++i )
                if(V[M[i][j-1]] <= V[M[i+(1<<(j-1))][j-1]])
                    M[i][j] =M[i][j-1];
                else
                    M[i][j] = M[i+(1<<(j-1))][j-1];
        int x , y , dim ,k;
        for( int i = 1 ; i <= K ; ++i )
        {
            scanf("%d%d" , &x , &y );
            dim = y-x+1;
            k = log[dim];
            if(V[M[x][k]] < V[M[y-(1<<k)+1][k]])
                printf("%d\n" ,V[M[x][k]]);
            else
                printf("%d\n" , V[M[y-(1<<k)+1][k]]);
        }
    }