Cod sursa(job #185913)

Utilizator gigi_becaliGigi Becali gigi_becali Data 26 aprilie 2008 13:11:29
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <string>
#include <cmath>
#define maxn 100001
#define maxlg 20
#define DIM 8192

int dp[maxlg][maxn];
int lg[maxn];
int n,m;

char ax[DIM];
int poz;

inline int min(int a, int b)
{
    if(a<b) return a;
    return b;
}

inline void cit(int &x)
{
    x=0;
    while(ax[poz]<'0' || ax[poz]>'9')
        if(++poz==DIM) fread(ax, 1, DIM, stdin), poz=0;
    
    while(ax[poz]>='0' && ax[poz]<='9')
    {    
        x=x*10+ax[poz]-'0';
        if(++poz==DIM) fread(ax, 1, DIM, stdin), poz=0;
    }
}

void read()
{
    freopen("rmq.in","r",stdin);
    cit(n);cit(m);
    //    scanf("%d %d\n", &n, &m);
    int i;
    for(i=1;i<=n;++i)cit(dp[0][i]);// scanf("%d ", &dp[0][i]);
//	for(i=1;i<=n;++i)printf("%d ", dp[0][i]);
	//printf("\n");
}

void solve()
{
    int i, j, cnt;
	
    for(i=1;i<20;++i)
        for(j=1;j+(1<<i)-1<=n;++j)
            dp[i][j]=min(dp[i-1][j], dp[i-1][j+(1<<(i-1))]);
		
    for(i=1;i<=n;++i) lg[i]=(int)log2((double)i);

	
	//for(i=1;i<=n;++i) printf("%d ", dp[1][i]);
//	printf("\n");
}

inline int query(int a, int b)
{
    int p=lg[b-a];
//	printf("%d_\n", p);
    return min(dp[p][a],dp[p][b-(1<<p)+1]);
}


int main()
{
    freopen("rmq.out","w",stdout);
    read();
    solve();
    int p, q;
   // char ax[64], *t;
    while(m--)
    {
        /*
        gets(ax);
        t=strtok(ax, " ");
        p=atoi(t);
        t=strtok(0, " \n");
        q=atoi(t);
        */
	cit(p);cit(q);	
        //scanf("%d %d\n", &p, &q);
        printf("%d\n", query(p, q));
		
    }
	
    return 0;
}