Cod sursa(job #1818725)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 29 noiembrie 2016 19:14:06
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <math.h>
#include <vector>
#include <set>
#include <algorithm>
#include <cstring>
//#include <unordered_map>
#include <iomanip>
#include <time.h>
#include <stdio.h>
#include <bitset>
#include <map>
#define MAX 500000000000
//#include <iostream>
//#include <windows.h>
#include <deque>
using namespace std;
//ifstream cin("jocul.in");
//ofstream cout("jocul.out");
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int ds[16][100001], x;
void construct(int n)
{
    int v = log2(n) + 1;
    for(int i = 1; i < v; i++)
    {
        int g = (1<<(i - 1)) - 1;
        n -= (g + 1);
        for(int j = 0; j < n; j++)
            ds[j][i] = min(ds[j][i - 1], ds[j + g + 1][i - 1]);
    }
}
int query(int a, int b)
{
    a--;
    b--;
    int val = b - a + 1, index = 0, sum = 1<<30;
    while(a <= b){
        if(val % 2 != 0){
            sum = min(sum, ds[a][index]);
            a += (1<<index);
        }
        val /= 2;
        index++;
    }
    return sum;
}
int main()
{
    int n, m;
    cin >> n >> m;
    for(int i = 0; i < n; i++){
        cin >> x;
        ds[i][0] = x;
    }
    construct(n);
    for(int i = 0; i < m; i++)
    {
        int a, b;
        cin >> a >> b;
        cout << query(a, b) << "\n";
    }
    return 0;
}