Cod sursa(job #2181676)

Utilizator Cristina-RamonaMateescu Cristina Cristina-Ramona Data 21 martie 2018 19:54:47
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>
#include <stdlib.h>

int main()
{   char input[]="grader_test2.in";
    char output[]="rmq.out";
    FILE *f=fopen(input,"rt");
    FILE *g=fopen(output,"wt");
    int n,M[17][1001],i,j,m,p[1001],k,l,r,len,expo;
    p[1]=0; //2^i<=p[i]
    expo=1;
    fscanf(f,"%d",&n);
    fscanf(f,"%d",&m);
        for(j=1;j<=n;j++)
            {fscanf(f,"%d",&M[0][j]);
             {if(2*expo<=j+1){p[j+1]=p[j]+1;expo=expo*2;}
              else p[j+1]=p[j];
             }
            }
        for(i=1;(1<<i)<=n;i++)
           {
               for(j=1;j<=n-(1<<i)+1;j++)
                {
                    {if(M[i-1][j]<M[i-1][j+(1<<(i-1))])
                        M[i][j]=M[i-1][j];
                    else M[i][j]=M[i-1][j+(1<<(i-1))];}

                }

           }

    for ( k=1; k<=m;k++)
		{ fscanf(f,"%d %d",&l,&r);
		  len=r-l+1;
		  i=p[len];


		  if(M[i][r-(1<<i)+1]>M[i][l])
                fprintf(g,"%d\n", M[i][l]);


		  else fprintf(g,"%d\n",M[i][r-(1<<i)+1]);


		}
	fclose(f);
	fclose(g);
	return 0;
}