Cod sursa(job #3155107)

Utilizator amavutsiviataAndrei Preda amavutsiviata Data 7 octombrie 2023 12:55:52
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#define MAX 100001

using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");


int i, lg[MAX+1], j, n, x, v[MAX+1], y, a[MAX][100];

int pow( int baza, int exp ) {
      if ( exp == 0 )
        return 1;
      if ( exp % 2 == 0 ) {
        return pow( baza * baza, exp / 2 );
      } else {
        return pow( baza * baza, exp / 2 ) * baza;
      }
    }

int main()
{
    int m;
    cin >> n >> m;
    for (i = 0; i < n; i++)
    {
        cin >> v[i];
        a[i][0] = v[i];
    }
    lg[1] = 0;
    for (i = 2; i <= MAX; i++)
        lg[i] = lg[i/2]+1;
    int p = 1;
    for (j = 1; j <= lg[n]; j++)
    {
        p*=2;
        for (i = 0; i < n - p+1; i++)
        {
            a[i][j] = min(a[i][j-1], a[i+pow(2, j-1)][j-1]);
        }
    }

    for (i = 0; i < m; i++)
    {
        cin >> x >> y;
        int len = y-x+1;
        cout << min(a[x-1][lg[len]], a[y-pow(2,lg[len])][lg[len]]) << '\n';
    }
    return 0;
}


/*


    int pow( int baza, int exp ) {
      if ( exp == 0 )
        return baza;
      if ( exp % 2 == 0 ) {
        return pow( baza * baza, exp / 2 );
      } else {
        return pow( baza * baza, exp / 2 ) * baza;
      }
    }

*/