Cod sursa(job #1245829)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 20 octombrie 2014 08:32:13
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <stdio.h>
#include <math.h>

long int d[17][100000];

int main()
{
    long int n,m,nr,x,y,count=0,use=1,min=100000;
    bool flag=0;
    FILE *fin,*fout;
    fin=fopen("rmq.in","r");
    fout=fopen("rmq.out","w");
    fscanf(fin,"%ld %ld",&n,&m);
    for(int i=0;i<n;i++)
    {
            fscanf(fin,"%ld",&d[0][i]);//fscanf(fisier,"%d(ecimal)",&-adresa de citire);
    }
    for(int i=1;i<17;i++)
    {
            nr=i-1;
            nr=pow(2,nr);
            for(int j=0;d[i-1][j+nr]!=0;j++)
            {
                    if(d[i-1][j]<d[i-1][j+nr])
                    {
                                              d[i][j]=d[i-1][j];
                    }
                    else
                    {
                        d[i][j]=d[i-1][j+nr];
                    }
            }
    }
    for(long int k=0;k<m;k++)
    {
             flag=0;
             fscanf(fin,"%ld %ld",&x,&y);
             count=0;
             use=1;
             while(use<=y-x)
             {
                            count++;
                            use*=2;
                            flag=1;
             }
             if(flag==1)
             {
                        count--;
             }
             use/=2;
             use=y-x-use+1;
             min=100000;
             for(long int j=x-1;j<=x+use-1;j++)
             {
                      if(min>d[count][j])
                      {
                                         min=d[count][j];
                      }
             }
             fprintf(fout,"%ld",min);
             if(k!=m-1)
             {
                       fprintf(fout,"\n");
             }
    }
}