Cod sursa(job #2748690)

Utilizator euyoTukanul euyo Data 2 mai 2021 16:19:28
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
const int MaxN=100001,Log3Max=11;
int v[MaxN],mn[Log3Max][MaxN],pw3[]={1,3,9,27,81,243,729,2187,6561,19683,59049,177147},lg3[MaxN];
int main() {
  ifstream fin("rmq.in");
  ofstream fout("rmq.out");
  int n,q,x,y,lg;
  fin>>n>>q;
  for(int i=1;i<=n;i+=1)
	fin>>v[i];
  for(int i=3;i<=n;i+=1) 
	lg3[i]=lg3[i/3]+1;
  for(int i=1;i<=n;i+=1)
    mn[0][i]=v[i];
  for(int p=1;p<=Log3Max;p+=1)
	for(int i=1;i+pw3[p]-1<=n;i+=1)
	  mn[p][i]=min({mn[p-1][i],mn[p-1][i+pw3[p-1]],mn[p-1][i+2*pw3[p-1]]});
  while(q--) {
	fin>>x>>y;
	lg=lg3[y-x+1];
	if(x+(2*pw3[lg])-1<=y) { 
      fout<<min({mn[lg][x],mn[lg][x+pw3[lg]],mn[lg][y-pw3[lg]+1]})<<"\n"; 
    } else {
	  fout<<min(mn[lg][x],mn[lg][y-pw3[lg]+1])<<"\n";
	}
  }
  return 0;
}