Cod sursa(job #290266)

Utilizator snaked31Stanica Andrei snaked31 Data 27 martie 2009 18:24:29
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <stdio.h>

#define nm 100010 
#define mm 18 
int v[nm]; 
int a[nm][mm]; 
int n, m, i, x, y, j; 
inline int mn (int a, int b) { return (a < b ? a : b); } 
int rmq(int x, int y) 
{ 
int z = (y-x+1); int k = 0, p = 1; while (p <= z) { ++k; p *= 2; } --k; 
return (mn ( v[a[x][k]], v[a[y-(1 << k)+1][k]] )); } 


void read() 


{ scanf("%d %d ", &n, &m); 
for (i=1; i<=n; ++i) 
{ 
scanf("%d ", &v[i]); 
a[i][0] = i; 
} 
for (j=1; 1 << j <=n; ++j) 
{ 
for (i=1; (i + (1 << j) - 1 <=n; ++i) 
{ if (v[a[i][j-1]] < v[a[i + (1 << (j-1))][j-1]]) 
a[i][j] = a[i][j-1]; 
else 
a[i][j] = a[i + (1 << (j-1))][j-1]; 
} 
} 
} 

void solve() 

{ 

for (i=1; i<=m; ++i) 
{ 
scanf("%d %d ", &x, &y); printf("%d\n", rmq(x, y)); 
} 
} 

void write() 
{ } 


int main() { freopen("rmq.in", "r", stdin); 
freopen("rmq.out","w",stdout); read(); solve(); write(); return 0; }