Cod sursa(job #2969785)

Utilizator LucaT2Tasadan Luca LucaT2 Data 23 ianuarie 2023 18:29:10
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n,a[100005],m,lg[100005];
int M[100005][18];


int main()
{
    fin>>n>>m;
    for(int i=0;i<n;i++)
        fin>>a[i];
    lg[1]=0;
	for (int i=2;i<=n;i++)
		lg[i]=lg[i/2]+1;
   // for(int i=1;i<=n;i++)
      //  fout<<lg[i]<<" ";
   // fout<<"\n";
   int i, j;

    //initialize M for the intervals with length 1
    for (i = 0; i < n; i++)
      M[i][0] = i;
    //compute values from smaller to bigger intervals
    for (j = 1; 1 << j <= n; j++)
      for (i = 0; i + (1 << j) - 1 < n; i++)
      {
        if (a[M[i][j - 1]] < a[M[i + (1 << (j - 1))][j - 1]])
          M[i][j] = M[i][j - 1];
        else
          M[i][j] = M[i + (1 << (j - 1))][j - 1];
       // fout<<M[i][j]<<" ";
      }
    int l,diff,sh,x,y;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        x=x-1;
        y=y-1;
        int l=(int)log2(y-x+1);
		//fout<<l<<" "<<x<<" "<<y<<" "<<diff<<"\n\n";
		if(a[M[x][l]]<=a[M[y-(1<<l)+1][l]])
            fout<<a[M[x][l]]<<"\n";
        else fout<<a[M[y-(1<<l)+1][l]]<<"\n";
    }
    return 0;
}