Cod sursa(job #1196852)

Utilizator RazvanR104Razvan-Andrei Ciocoiu RazvanR104 Data 9 iunie 2014 13:40:23
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <iomanip>
#include <fstream>

#include <algorithm>
#include <bitset>
#include <deque>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#if __cplusplus > 199711L
#include <unordered_map>
#include <unordered_set>
#endif

#include <cstdio>
#include <ctime>
#include <cmath>
#include <cstring>
#include <cstdlib>

using namespace std;

typedef long long int64;

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

const int NMAX = 100010, LOGNMAX = 17;

int N, M;
int value[NMAX], RMQ[NMAX][LOGNMAX];

inline int log2(int value)
{
    int ret = -1;
    for ( ; value; value >>= 1, ++ret);
    return ret;
}

inline int pow2(const int exp) { return (1 << exp); }

int main()
{
    int i, j, x, y;

    fin >> N >> M;

    for (i = 1; i <= N; ++i)
        fin >> value[i];

    for (i = 1; i <= N; ++i)
        RMQ[i][0] = i;

    for (j = 1; pow2(j) <= N; ++j)
    {
        for (i = 1; i + pow2(j) - 1 <= N; ++i)
        {
            if (value[RMQ[i][j - 1]] < value[RMQ[i + pow2(j - 1)][j - 1]])
                RMQ[i][j] = RMQ[i][j - 1];
            else
                RMQ[i][j] = RMQ[i + pow2(j - 1)][j - 1];
        }
    }

    while(M--)
    {
        fin >> x >> y;
        int k = log2(y - x + 1);
        fout << ((value[RMQ[x][k]] < value[RMQ[y - pow2(k) + 1][k]]) ? (value[RMQ[x][k]]) : (value[RMQ[y - pow2(k) + 1][k]]));
        fout << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}