Cod sursa(job #2621781)

Utilizator paulaiugaPaula Iuga paulaiuga Data 30 mai 2020 19:03:31
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

///RMQ = min din interv [x,y] cu sparse table;
int a[100002];
int rmq[100002][18];

int calculeaza_putere(int p)
{
    int x = 2;
    if(p == 0)
        return 1;

    while(p-1)
    {
        x*=2;
        p--;
    }

    return x;

}

int main()
{
    int n, m,x,y;
    in>>n>>m;


   //cout<<calculeaza_putere(0);
//    for(int i = 0; i<n; i++)
//        cin>>a[i];
//
//    for (int i = 0; i<n; i++)
//       rmq[i][0] = a[i];

 for (int i = 0; i<n; i++)
    in>> rmq[i][0];




// for(int i = 0; i<n ;i++)
// {
//     cout<<a[i];
// }

//    int log[100002];
//    log[1] = 0;
//    for (int i = 2; i <= 100002; i++)
//        log[i] = log[i/2] + 1;


//    for (int j = 1; j <= n; j++)
//    {
//        int w = calculeaza_putere(j);
//        //cout<<w<<" ";
//        for (int i = 0; i + w <= n; i++)
//            rmq[i][j] = min(rmq[i][j-1], rmq[i + w/2][j - 1]);
//    }


    for (int j = 1; calculeaza_putere(j) <= n; j++)
    {
        int w = calculeaza_putere(j);
        //cout<<w<<" ";
        for (int i = 0; i + w <= n; i++)
            rmq[i][j] = min(rmq[i][j-1], rmq[i + w/2][j - 1]);
    }

int j;
while(m)
{
    in>>x>>y;

   //j = log[(y-1) - (x-1) + 1];
   j = (int)log2((y-1) - (x-1) + 1);
int minimum = min(rmq[x-1][j], rmq[y - calculeaza_putere(j)][j]);
out<<minimum<<"\n";
m--;
}



    in.close();
    out.close();


    return 0;
}