Cod sursa(job #3134403)

Utilizator AnaRosuAna Maria Rosu AnaRosu Data 28 mai 2023 22:57:09
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");
//Se da un vector cu N elemente. Scrieti un program care raspunde la M intrebari de tipul "Care este elementul minim din intervalul [x,y]?"
//Pe prima linie a fisierului rmq.in sunt date numerele N si M. Urmatoarele N linii vor contine cate un numar reprezentand elementele vectorului. Urmatoarele M linii vor contine cate 2 numere reprezentand valorile x si y care definesc intrebarile.

//timp de procesare: O(n*n)
//query time: O(1)
//extra space: O(n*n)

int n,m, rmq[20][100001],x,y, v[100001];
int main(){
  
  f>>n>>m;
  for(int i = 1; i <= n; ++i){
    f>>v[i];
    rmq[0][i]=v[i];
  }

//iteram peste puterile lui 2 de la 1 la n (inclusiv) 
// pentru a calcula numărul de linii din matricea rmq
//pentru fiecare putere a lui 2, iteram peste toate intervalele de lungime 2^i
   for(int i = 1; (1 << i) <= n; ++i)
        for(int j = 1; j <= n- (1<<i) + 1; ++j)
        //val minimă se calculează prin compararea elementelor din rândul anterior, rmq[i - 1][j] și rmq[i - 1][j + (1 << (i - 1))]. Ultimul indice  reprezintă începutul următorului segment de lungime 2^i, deci este egal cu j + 2^(i - 1).
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j+(1<<(i-1))]);


  for(int i = 1; i <= m; ++i){
    f>>x>>y;
    //y-x+1 - lungimea intervalului
    //p determina indexul liniei din matricea rmq care trb accesat
    int p = log2(y-x+1);
    g<<min(rmq[p][x], rmq[p][y - (1 << p) + 1])<<endl;
  } 
  f.close();
  g.close();

  return 0;
}