Cod sursa(job #533803)

Utilizator andra23Laura Draghici andra23 Data 14 februarie 2011 17:24:57
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
// Complexitate: <O(nlogn), O(1)>

#include<fstream>
#include<cmath>
#define maxn 100005
#define maxm 1000005

using namespace std;

int n, m;
int a[maxn], v[maxn];
int c[maxn][20];

int main() {
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    
    f >> n >> m;
    int i, j;
    int x, y, minim;
    
    for (i = 1; i <= n; i++)
        f >> a[i];
    
    for (i = 1; i <= n; i++)
        c[i][0] = a[i];
        
    for (j = 1; (1<<j) <= n; j++) {
        for (i = 1; i + (1<<j) - 1 <= n; i++) {
            c[i][j] = c[i][j-1];
            if (c[i+(1<<(j-1))][j-1] < c[i][j])
                c[i][j] = c[i+(1<<(j-1))][j-1];
        }
    }
    
    for (i = 1; i <= m; i++) {
        f >> x >> y;
        int t = 0, tt = 1;
        int dif = y - x + 1;
        while (tt < dif) {
            tt = 2*tt;
            t++; 
        }  
        t--;
        minim = c[x][t];
        if (c[y-(1<<t)+1][t] < minim) 
            minim = c[y-(1<<t)+1][t];
        
        g << minim << '\n';
    }
            
}