Cod sursa(job #346170)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 7 septembrie 2009 00:56:39
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
/* <O(n log n) - PreProc >
   <O(1) - Query >
*/
#define MAX 100005
#include<stdio.h>
int A[MAX];
int B[18][MAX];
int N;
int Pow2[50];
int contor;
int loglung;
int Q;
int st;
int fin;
int log2(int t)
{
    int p = 1, count = 0;
    while (p <= t)
    {
     p *= 2;
     count++;
    }
    return count - 1;
}
void PreProc()
{
    for(int i = 1; i <= N; i++)
     B[0][i] = i;
    for(int i = 1; i <= 17; i++)
     {
         for(int j = 1; j <= N; j++)
          if (Pow2[i] + j <= N + 1)
           {
               if (A[B[i - 1][j]] < A[B[i - 1][j + Pow2[i-1] ]])
                B[i][j] = B[i - 1][j];
               else
                B[i][j] = B[i - 1][j + Pow2[i-1]];
           }
           else
            break;
     }

}
int Init()
{
    int p = 1;
    while (p <= MAX)
    {
        Pow2[contor] = p;
        contor++;
        p *= 2;
    }
}

int main()
{
        freopen("rmq.in", "r", stdin);
        freopen("rmq.out", "w", stdout);

        scanf("%d %d",&N,&Q);
        for(int i = 1; i <= N; i++)
         scanf("%d",&A[i]);
        Init();
        PreProc();
        for(int i = 1; i <= Q; i++)
         {
             scanf("%d %d",&st,&fin);
             loglung = log2(fin - st + 1);
             if (A[B[loglung][st]] < A[B[loglung][fin - Pow2[loglung] + 1]])
              printf("%d\n",A[B[loglung][st]]);
             else
              printf("%d\n",A[B[loglung][fin - Pow2[loglung] + 1]]);



         }

        return 0;

}