Cod sursa(job #2981682)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 18 februarie 2023 15:16:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#define log 19
#define dim 100001
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int rmq[log][dim], puteri2[dim], v[dim];
int n;

void build_rmq()
{
    for(int p=1;p<log;p++)
    {
        for(int nod=1;nod<=n;nod++)
        {
            int crt=rmq[p-1][nod];
            if(nod+(1<<(p-1))<=n)
            {
                int crt2=rmq[p-1][nod+(1<<(p-1))];
                rmq[p][nod]=min(crt, crt2);
            }
            else
            {
                rmq[p][nod]=crt;
            }
        }
    }
}

void puteri_2()
{
    puteri2[1]=0;
    for(int i=2;i<=n;i++)
    {
        puteri2[i]=puteri2[i/2]+1;
    }
}

int main()
{
    int i, m, x, y;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
        rmq[0][i]=v[i];
    }
    puteri_2();
    build_rmq();
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        if(x>y)
        {
            swap(x, y);
        }
        int p=puteri2[y-x+1];
        int crt=min(rmq[p][x], rmq[p][y-(1<<p)+1]);
        fout<<crt<<"\n";
    }
}