Cod sursa(job #3001490)

Utilizator SoverMSover Mihai SoverM Data 13 martie 2023 18:32:14
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>
#define INF 1000000000
using namespace std;
ifstream fi ("rmq.in");
ofstream out ("rmq.out");
int T[100001][20];
int k;
int n;
int m;

int query(int st, int dr)
{
    int rez;
    rez=INF;
    for (int col=k;col>=0;col--)
        if (st+(1<<col)-1<=dr)
        {
            rez=min(rez,T[st][col]);
            st=st+(1<<col);
        }
    return rez;
}

int main()
{
    fi >> n;
    fi>>m;
    for(int i = 1; i <= n; i ++)
        fi >> T[i][0];
    /// etapa I, se obtine T
    int p;
    k=0;
    p=1;
    while (p*2<=n)
    {
        k++;
        p=p*2;
    }
    for (int col=1;col<=k;col++)
        for (int i=1;i<=n-(1<<col)+1;i++)
            T[i][col]=min(T[i][col-1],T[i+(1<<(col-1))][col-1]);

    /// etapa II, se citesc interogarile si se raspunde la ele
    for (int i=1;i<=m;i++)
    {
        int st, dr;
        fi >> st >> dr;
        out<<query(st, dr)<<"\n";
    }
    return 0;
}