Cod sursa(job #2766542)

Utilizator AACthAirinei Andrei Cristian AACth Data 2 august 2021 10:48:59
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;
#define f cin
#define g cout
#define int long long
const int Max = 1e5 + 1;
void nos()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
}
namespace SparseTables{
	int ST[21][Max];
	int LOG2[Max];
	int n;
	void precomputeLog2()
	{
		int i;
		for(i=2;i<=n;i++)
			LOG2[i] = LOG2[i>>1] + 1;
	}
	int merge(int a, int b)
	{
		//edit merge for diferent function
		return min(a,b);
	}
	void Init(std::vector< int > v)
	{
		int i,j;
		n = v.size() - 1;
		precomputeLog2();
		for(i=0;i<v.size();++i)
			ST[0][i] = v[i];
		for( i = 1; (1<<i) <= n;++i)
			for(j = 0; j + (1<<i) - 1<= n;++j)
				ST[i][j] = merge(ST[i-1][j],ST[i-1][j + (1<<(i-1))]);
	}
	int ConstantQueryMinMax(int left, int right)
	{
		if(left > right)
			swap(left,right);
		int k = LOG2[right - left + 1];
		return merge(ST[k][left],ST[k][right - (1<<k) + 1]);
	}


}
int n,m;
vector < int > v;
ifstream f("rmq.in");
ofstream g("rmq.out");
void read()
{
	f>>n>>m;
	int i;
	for(i=1;i<=n;i++)
		{
			int x;
			f>>x;
			v.push_back(x);
		}
	SparseTables::Init(v);
}
void solve()
{
    while(m -- )
    {
    	int left, right;
    	f>>left>>right;
    	left --;
    	right --;
    	g<<SparseTables::ConstantQueryMinMax(left,right)<<'\n';
    }
}
void restart()
{

}
int32_t main()
{
    nos();

        read();
        solve();
        restart();
    
    return 0;
}