Cod sursa(job #3288720)

Utilizator Lex._.Lexi Guiman Lex._. Data 23 martie 2025 21:52:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> rmq;
int lg[100000]; //logaritmul fiecarui numar de la 1 la n

int main()
{
    ifstream cin("rmq.in");
    ofstream cout("rmq.out");
    int n, m;
    cin >> n >> m;
    rmq.resize(20);
    rmq[0].resize(n);
    for(int i=0; i<n; i++)
    {
        cin >> rmq[0][i]; //citim elementele vectorului in primul nivel al rmq-ului
    }
    for(int e=1; (1<<e)<n; e++) //calculam structura de date rmq
    {
        for(int i=(1<<e); i<(1<<(e+1)) && i<n; i++) //calculam logaritmul fiecarui numar de la 2^e la 2^(e+1)
            lg[i]=e;
        rmq[e].resize(rmq[e-1].size()-e); //calculam nivelul e al rmq-ului
        for(int i=0; i<rmq[e].size(); i++)
        {
            rmq[e][i]=min(rmq[e-1][i], rmq[e-1][i+(1<<(e-1))]);
        }
    }

    for(int i=0; i<m; i++)
    {
        int x, y;
        cin >> x >> y; //citim capetele intervalului
        x--; y--; //incepem indexarea de la 0
        int exponent=lg[y-x+1];
        int minim=min(rmq[exponent][x], rmq[exponent][y-(1<<exponent)+1]);
        cout << minim << "\n";
    }

    return 0;
}