Cod sursa(job #1967892)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 17 aprilie 2017 11:58:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdint.h>
#include <fstream>
#include <math.h>
#define nmax 100001
#define mmax 1000001
#define log2n  18
using namespace std;
fstream f1("rmq.in", ios::in);
fstream f2("rmq.out", ios::out);
int32_t n, m, a[nmax][log2n], v[nmax], put2[nmax];
int main()
{
    int32_t i, var, l, r, j;
    f1>>n>>m;
    var=log2(n);
    for(i=1; i<=n; i++)
        f1>>v[i];
    ///a[i][j]= minimul pe intervalul care incepe la pozitia i si cuprinde 2^j elemente
    put2[0]=1;
    put2[1]=2;
    for(i=2; i<=n;  i++)
        put2[i]=put2[i-1]<<1;
    for(i=1; i<=n; i++)
        a[i][0]=i;
    for(j=1; j<=var; j++)
        for(i=1; put2[j]+i-1<=n; i++)
            if(v[a[i][j-1]]>v[a[put2[j-1]+i][j-1]]) a[i][j]=a[put2[j-1]+i][j-1];
            else a[i][j]=a[i][j-1];

    for(i=1; i<=m; i++)
    {
        f1>>l>>r;
        j=log2(r-l+1);
        if(v[a[l][j]]> v[a[r-put2[j]+1][j]])  f2<<v[a[r-put2[j]+1][j]];
        else  f2<<v[a[l][j]];
        f2<<"\n";
    }
    return 0;
}