Cod sursa(job #2512118)

Utilizator stefan.popescuPopescu Stefan stefan.popescu Data 20 decembrie 2019 16:28:48
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#define min(x, y) y ^ ((x ^ y) & -(x < y))
using namespace std;
ifstream in ("rmq.in");
ofstream out("rmq.out");
//int mm[10000][1000];
vector <int> a;
vector < vector <int> > mm;
vector <int> dummy;
int lg2[100010];
int n, m;
int x1, x2;

void preproc()
{
    dummy.resize(lg2[n]+1, 0);
    mm.resize(n+2, dummy);
    for(int i=0; i<n; i++)
        mm[i][0]=a[i];
    for(int put=1; (1<<put)<=n; put++)
    {
        for(int i=0; i+(1<<put)-1<n; i++)
        {
            mm[i][put]=min(mm[i][put-1], mm[i+(1<<(put-1))][put-1]);
        }
    }
}
int rmq(int x1, int x2)
{
    int poz=(int)lg2[x2-x1+1];
    return min(mm[x1][poz], mm[x2-(1<<poz)+1][poz]);
}
int main()
{
    in>>n>>m;
    lg2[1]=0;
    for(int i=2; i<=n; i++)
        lg2[i]=lg2[i>>1]+1;
    a.resize(n+1);
    for(int i=0; i<n; i++)
        in>>a[i];
    preproc();
    for(int i=1; i<=m; i++)
    {
        in>>x1>>x2;
        out<<rmq(x1-1, x2-1)<<"\n";
    }

    return 0;
}