Cod sursa(job #1256441)

Utilizator vlady1997Vlad Bucur vlady1997 Data 6 noiembrie 2014 12:01:19
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
        #include <cstdio>
        using namespace std;
        int a[100001], rmq[20][100001], lg[100001];
        int min (int x, int y)
        {
            if (x<y) return x;
            return y;
        }
        void RMQ (int n)
        {
            int i, j, x;
            for (i=1; (1<<i)<=n; i++)
            {
                x=1<<(i-1);
                for (j=1; j<=n-(1<<i)+1; j++)
                {
                    rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+x]);
                }
            }
            rmq[i][1]=min(rmq[i-1][1],rmq[i-1][2]);
        }
        int main()
        {
            int n, t, i, x, y, k;
            freopen("rmq.in","r",stdin);
            freopen("rmq.out","w",stdout);
            scanf("%d%d",&n,&t); lg[1]=0;
            for (i=1; i<=n; i++)
            {
                scanf("%d",&a[i]);
                rmq[0][i]=a[i];
                if (i>1) lg[i]=lg[i/2]+1;
            }
            RMQ(n);
            for (i=1; i<=t; i++)
            {
                scanf("%d%d",&x,&y);
                k=lg[y-x+1];
                printf("%d\n",min(rmq[k][x],rmq[k][y-(1<<k)+1]));
            }
            fclose(stdin);
            fclose(stdout);
            return 0;
        }