Cod sursa(job #2977711)

Utilizator degoCozma Diego dego Data 12 februarie 2023 12:17:24
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int v[100002],mat[100002][22],n,m;
void constr(int k)
{
   for(int i=0;i<k;i++)
        mat[i][0]=i;
    for(int j=1;(1<<j)<=k;j++)
    {

        for(int i=0;(i+(1<<j)-1)<k;i++)
            if(v[mat[i][j-1]]<v[mat[i+(1<<(j-1))][j-1]])
            mat[i][j]=mat[i][j-1];
        else
            mat[i][j]=mat[i+(1<<(j-1))][j-1];
    }

}
int query(int l,int r)
{
    int j=(int)log2(r-l+1);
    return min(v[mat[l][j]],v[mat[r-(1<<j)+1][j]]);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    f>>n>>m;
    for(int i=0;i<n;i++)
        f>>v[i];
    constr(n);
    int x,y;
    for(int i=0;i<m;i++)
    {
        f>>x>>y;
        g<<query(x-1,y-1)<<'\n';
    }
    return 0;
}