Cod sursa(job #1001335)

Utilizator cosmin_bobeicaCosmin Bobeica cosmin_bobeica Data 24 septembrie 2013 20:49:52
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<cstdio>
using namespace std;
int v[100001],log[100001];
int a[100001][25];
int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int n,m;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&v[i]);
    for(i=1;i<=n;i++)
        a[i][0]=i;
    for (j = 1; 1 << j <= N; j++)
          for (i = 0; i + (1 << j) - 1 < N; i++)
              if (v[a[i][j - 1]] < v[a[i + (1 << (j - 1))][j - 1]])
                  a[i][j] = a[i][j - 1];
              else
                  a[i][j] = a[i + (1 << (j - 1))][j - 1];
    e=0;
    l=1;
    for(i=1;i<=n;i++)
    {
        if(i>=l*2)
        {
            l=l*2;
            e++;
        }
        log[i]=e;
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d %d",&i,&j);
        k=log[j-i+1];
        sol=0;
        if(v[a[i][k]]<=v[a[j-(1<<k)+1][k]])
            sol=v[a[i][k]];
        else
            sol=v[a[j-(1<<k)+1][k]];
        printf("%d\n",sol);
    }
    return 0;
}