Cod sursa(job #1117332)

Utilizator PatrikStepan Patrik Patrik Data 23 februarie 2014 13:33:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define NMAX 100001
    #define KMAX 20
    int N , M , R[NMAX][KMAX] , v[NMAX] , log[NMAX];


    int main()
    {
        int x , y;
        freopen("rmq.in" , "r" , stdin );
        scanf("%d%d" , &N , &M );
        for(int i = 1 ; i <= N ; ++i )
            scanf("%d" , &v[i]);
        for(int i = 1 ; i<= N ; ++i )
            R[i][0] = v[i];
        for(int k = 1 ; (1<<k) <= N ; ++k )
            for(int i = 1 ; i+ (1<<k)-1 <= N ; ++i )
                R[i][k] = min(R[i][k-1],R[i+(1<<(k-1))][k-1]);

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

        freopen("rmq.out" , "w" , stdout );
        for(int i = 1 ; i<= M ; ++i )
        {
            scanf("%d%d" , &x , &y );
            int k = log[y-x+1];
            printf("%d\n", min(R[x][k],R[y-(1<<k)+1][k]));
        }
        return 0;
    }