Cod sursa(job #2554060)

Utilizator memecoinMeme Coin memecoin Data 22 februarie 2020 15:35:11
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <iomanip>
#include <string>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>
#include <set>
#include <map>
#include <string.h>
#include <queue>
#include <stack>

#define INF 0x3f3f3f3f

using namespace std;

#ifdef DEBUG
string name = "data";
#else
string name = "rmq";
#endif

ifstream fin(name + ".in");
ofstream fout(name + ".out");

#define MAXN 100005
#define MAXL 17

int n, m;
int rmq[MAXL][MAXN];
int lg[MAXN];

int main() {
    
    fin >> n >> m;
    
    memset(rmq, 0x3f, sizeof(rmq));

    int last = 0;
    int lastVal = 1;
    
    for (int i = 1; i <= n; ++i) {
        fin >> rmq[0][i];
        if (i == (lastVal * 2)) {
            last++;
            lastVal = i;
        }
        
        lg[i] = last;
    }
    
    
    for (int j = 1; (1 << j) <= n; ++j) {
        int l = (1 << j) - 1;
        int k = 1 << (j - 1);
        for (int i = 1; i <= n - l; ++i) {
            rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + k]);
        }
    }
    
    for (int i = 0; i < m; ++i) {
        int x, y;
        fin >> x >> y;
        
        int d = y - x + 1;
        
        int k = lg[d];
        
        int nd = y - (1 << k) + 1;
        
        fout << min(rmq[k][x], rmq[k][nd]) << "\n";
        
    }
    
    return 0;
}