Cod sursa(job #2280270)

Utilizator herbertoHerbert Mohanu herberto Data 10 noiembrie 2018 13:11:39
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100001
#define MAXP 20

int d[MAXN][MAXP];
int v[MAXN];
int n, m;
int lg[MAXN];

int minim(int a, int b){
	if(a<b)
		return a;
	return b;
}

void rmq(){
	int p, i;
	printf("%d\n", n);
	for(p=1; (1<<p)<n; p++){
    for(i=1; i-1+(1<<p)<=n; i++)
			d[i][p]=minim(d[i][p-1], d[i+(1<<p-1)][p-1]);

  }
}
int main(){
  FILE*fin=fopen("rmq.in", "r");
  FILE*fout=fopen("rmq.out", "w");
  int i, p, j, ans;
	fscanf(fin, "%d%d", &n, &m);
	for(i=1; i<=n; i++)
		fscanf(fin, "%d", &v[i]);

	for(i=1; i<=n; i++)
    d[i][0]=v[i];

	rmq();
	lg[1]=0;
	for(i=2; i<=n; i++)
		lg[i]=lg[i/2]+1;
	for(m; m>0; m--){
		fscanf(fin, "%d%d", &i, &j);
		ans=minim(d[i][lg[j-i]], d[j-(1<<lg[j-i])+1][lg[j-i]]);
		fprintf(fout, "%d\n", ans);
	}
//  for(p=0; (1<<p)<n; p++){
//		for(i=1; i<=n; i++)
//			printf("%d ", d[i][p]);
//		printf("\n");
//	}
	return 0;
}