Cod sursa(job #2635949)

Utilizator paul3ioanCirstean Paul Ioan paul3ioan Data 16 iulie 2020 01:55:14
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int query();
int q, n , v[100001], rmq[100001][20];
int main() {
    cin >> n >> q;
    for(int i = 1 ;i <=n ;i ++)
        cin >> v[i];
    for(int i = 1 ;i <=n ;i ++)
        rmq[i][0] = v[i];
    int log = 0;
    while( (1<< (log +1)) <=n)
        log ++;
    for(int j =1 ;j <= log ;j ++)
        for(int i = 1; i <= n - (1 << j) + 1; i ++)
    {
        rmq[i][j] = min(rmq[i][j - 1] , rmq[i + (1 << (j -1))][j - 1]);
    }
    while(q--)
    {
        cout << query()<< '\n';
    }
    return 0;
}
int query()
{
    int x, y;
    cin >> x >> y;
    if(x > y) swap(x, y);
    int log = 0, length = y -x + 1;
    while((1 << (log + 1)) <= length)
        log ++;
    return min(rmq[x][log], rmq[y - (1 << log) + 1][log]);
}