Cod sursa(job #2790830)

Utilizator whitevader28Albu Alexandru whitevader28 Data 29 octombrie 2021 16:58:54
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
#include <fstream>

using namespace std;
ifstream fin("rqm.in");
ofstream fout("rqm.out");

int minVal(int x, int y) { return (x < y)? x: y; }

int getMid(int s, int e) { return s + (e -s)/2; }

int RMQUtil(int *st, int ss, int se, int qs, int qe, int index)
{

	if (qs <= ss && qe >= se)
		return st[index];
	if (se < qs || ss > qe)
		return INT_MAX;
	int mid = getMid(ss, se);
	return minVal(RMQUtil(st, ss, mid, qs, qe, 2*index+1),
				RMQUtil(st, mid+1, se, qs, qe, 2*index+2));
}

int RMQ(int *st, int n, int qs, int qe)
{
	if (qs < 0 || qe > n-1 || qs > qe)
	{
		cout<<"Invalid Input";
		return -1;
	}

	return RMQUtil(st, 0, n-1, qs, qe, 0);
}
int constructSTUtil(int arr[], int ss, int se, int *st, int si)
{
	if (ss == se)
	{
		st[si] = arr[ss];
		return arr[ss];
	}
	int mid = getMid(ss, se);
	st[si] = minVal(constructSTUtil(arr, ss, mid, st, si*2+1), constructSTUtil(arr, mid+1, se, st, si*2+2));
	return st[si];
}

int *constructST(int arr[], int n)
{
	int x = (int)(ceil(log2(n)));
	int max_size = 2*(int)pow(2, x) - 1;
	int *st = new int[max_size];
	constructSTUtil(arr, 0, n-1, st, 0);
	return st;
}

int main()
{
    int N, M, stanga, dreapta;
    fin >> N >> M;
    //cin >> N >> M;
    int a[N];
    for(int i=0; i<N; i++)
    {
        fin >> a[i];
        //cin >> a[i];
    }
    int *st = constructST(a, N);
    while(M)
    {
        fin >> stanga >> dreapta;
        //cin >> stanga >> dreapta;
        fout << RMQ(st, N, stanga-1, dreapta-1)<<'\n';
        //cout << RMQ(st, N, stanga-1, dreapta-1)<<endl;
        M--;
    }

	return 0;
}