Cod sursa(job #1476781)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 25 august 2015 13:18:06
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>

#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int N,M;
int v[100010],lg[100010];
int rmq[100010][20];
// rmq[i][j]=pozitia minimului din intervalul [i,i + 2^j -1]

void preprocess();

int main()
{
    f>>N>>M;
    FOR (i,1,N) {
        f>>v[i];
    }
    FOR (i,2,N) {
        lg[i]=lg[i/2]+1;
    }
    preprocess();
    FOR (i,1,M) {
        int x,y;
        f>>x>>y;
        int dif=y-x+1;
        if (v[rmq[x][lg[dif]]]<v[rmq[y-(1<<lg[dif])+1][lg[dif]]]) {
            g<<v[rmq[x][lg[dif]]]<<'\n';
        }
        else {
            g<<v[rmq[y-(1<<lg[dif])+1][lg[dif]]]<<'\n';
        }
    }
    f.close();g.close();
    return 0;
}

void preprocess() {
    FOR (i,1,N) {
        rmq[i][0]=i;
    }
    for (int k=1;(1<<k)<=N;++k) {
        for (int i=1;i+(1<<k-1)<=N;++i) {
            if (v[rmq[i][k-1]]<v[rmq[i+(1<<k-1)][k-1]]) {
                rmq[i][k]=rmq[i][k-1];
            }
            else {
                rmq[i][k]=rmq[i+(1<<k-1)][k-1];
            }
        }
    }
}