Cod sursa(job #2570441)

Utilizator maria15Maria Dinca maria15 Data 4 martie 2020 16:49:46
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;

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

int n, m, i, exp, log[100002], d[10][100002], a, b;

int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>d[0][i];
    /// d[exp][i] = minimul din secventa ce incepe pe pozitia i si are lungimea 2 la exp
    /// d[0][i] -> secventa de lungime unu, adica chiar elementul i

    /// partea intreaga a logaritmului in baza a 2 a fiecarei lungimi posibile de interval
    log[1] = 0;
    for(i=2;i<=n;i++){
        log[i] = log[i-1];
        if((1<<(log[i]+1)) == i)
            log[i]++;
    }

    for(exp=1;exp<=log[n];exp++){
        int lung = (1<<exp);
        for(i=1;i<= n;i++){
            d[exp][i] = d[exp-1][i];    /// minimul din prima jumatate a subsecventei
            if(i+lung/2 <= n)
                d[exp][i] = min(d[exp][i], d[exp-1][i+lung/2]);
        }
    }
    for(i=1;i<=m;i++){
        fin>>a>>b;
        int lungime = b-a+1;
        exp = log[lungime];
        fout<<min(d[exp][a], d[exp][b-(1<<exp)+1])<<"\n";
    }
    return 0;
}