Cod sursa(job #3129741)

Utilizator lucaxsofLuca Sofronie lucaxsof Data 15 mai 2023 18:54:14
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <bitset>
#include <string>
#include <map>
#include <unordered_map>
//#include <bits/stdc++.h>
using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

//rmq again

// 1 2 3 4 5 6 7 8 9 10 11 12 13

const int NMAX = 1e5, LOGMAX = 21;

int v[NMAX], n,m;
int logg[NMAX];
int a[NMAX][LOGMAX];

void read()
{
	cin >> n >> m;
	for (int i = 1; i <= n; ++i)
		cin >> v[i], a[i][0]=v[i];
}

void get_log()
{
	for (int i = 2; i < NMAX; ++i)
		logg[i] = 1 + logg[i / 2];
}

void preprocess()
{
	for (int j = 1; j <= logg[n]; ++j)
		for (int i = 0; i <= n - (1 << (j - 1)); ++i)
			a[i][j] = min(a[i][j - 1], a[i+(1<<(j-1))][j - 1]);
	//minimul care pleaca de la elem 'i' cu lg 'j' este min dintre 
}

int query(int x, int y)
{
	int lg = y - x + 1;
	int Log = logg[lg] - 1;
	return min(a[x][Log], a[y - (1 << Log)+1][Log]);
}

int main()
{
	read();
	get_log();
	preprocess();
	for (int i = 1; i <= m; ++i)
	{
		int x, y;
		cin >> x >> y;
		cout << query(x, y)<<'\n';
	}
}