Cod sursa(job #1602250)

Utilizator TonisonIlle Antoniu Nicolae Tonison Data 16 februarie 2016 17:50:24
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

int n,m;

void afisare(vector<vector<int> > a)
{
    for(int i=0; i<17; i++)
    {
        for(int j=0; j<n; j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<"\n";
    }
}

int main()
{
    f>>n>>m;
    int x,y;
    vector<vector<int> > a(20, vector<int> (n, 0));
    for(int i=1; i<=n; i++)
    {
        f>>a[0][i];
    }
    /*
    for(int nivel=1, step=1; nivel<18; nivel++, step*=2)
    {
        for(int i=0; i+step<n; i++)
        {
            a[nivel][i]=min(a[nivel-1][i], a[nivel-1][i+step]);
        }
    }
    */
    int lg2[101];
    lg2[0]=lg2[1]=0;
    for(int i=2; i<=n; i++)
    {
        lg2[i]=lg2[i>>1]+1;
    }
    for(int i=1; i<=lg2[n]; i++)
    {
        int step=1<<(i-1);
        for(int j=1; j+step<=n; j++)
        {
            a[i][j]=min(a[i-1][j], a[i-1][j+step]);
        }
    }
    for(int i=0; i<m; i++)
    {
        f>>x>>y;
        int l=lg2[y-x+1], step=1<<l;
        g<<min(a[l][x], a[l][y-step+1])<<"\n";
    }
    //afisare(a);
    return 0;
}