Cod sursa(job #3182225)

Utilizator Horia123144Musat Horia Gabriel Horia123144 Data 8 decembrie 2023 18:44:44
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,v[100005],q,rmin[21][100005],rmax[21][100005],fr[100005],E[100005],verif[100005];
int main()
{
    fin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        fin>>v[i];
        rmin[0][i]=v[i];
        rmax[0][i]=v[i];
        ///fr[v[i]]++;
    }
    E[1]=0;
    for(int i=2;i<=n;i++)
        E[i]=1+E[i/2];
    for(int p=1;(1<<p)<=n;p++)
    {
        for(int i=1;i<=n;i++)
        {
            rmin[p][i]=rmin[p-1][i];
            int j=i+(1<<(p-1));
            if(j<=n && rmin[p][i]>rmin[p-1][j])
                rmin[p][i]=rmin[p-1][j];
        }
    }
    for(int p=1;(1<<p)<=n;p++)
    {
        for(int i=1;i<=n;i++)
        {
            rmax[p][i]=rmax[p-1][i];
            int j=i+(1<<(p-1));
            if(j<=n && rmax[p][i]<rmax[p-1][j])
                rmax[p][i]=rmax[p-1][j];
        }
    }
    int j=1;
    for(int i=1;i<=n;i++)
    {
        fr[v[i]]++;
        while(fr[v[i]]>1)
        {
            fr[v[j]]--;
            j++;
        }
        verif[i]=j;
    }
    int x,y,e,len,mini,maxi;
    for(int z=1;z<=q;z++)
    {
        fin>>x>>y;
        e=E[y-x+1];
        len=(1<<e);
        fout<<min(rmin[e][x],rmin[e][y-len+1])<<'\n';
    }
    return 0;
}