Cod sursa(job #3144568)

Utilizator Tibi201eweREWR Tibi201 Data 8 august 2023 21:17:27
Problema Range minimum query Scor 20
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct sir{
  int x,y,rez;
}Sir;

int batog[320],v[100000];
Sir intrebari[1000000];
Sir * ordine[1000000];
int comp(const void * a, const void * b){
  if(((Sir *) a)->x==((Sir *) b)->x){
    return ((Sir *) a)->y-((Sir *) b)->y;
  }
  return ((Sir *) a)->x-((Sir *) b)->x;
}
int main()
{
    FILE *fin, *fout;
    int intrebare,min,rad,n,m,i,x,y;
    fin=fopen("rmq.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    rad=sqrt(n);
    min=1000000;
    for(i=0; i<n; i++){
      fscanf(fin, "%d", &v[i]);
      if(v[i]<min)
        min=v[i];
      if((i+1)%rad==0){
        batog[i/rad]=min;
        min=1000000;
      }
    }
    fout=fopen("rmq.out", "w");
    for(intrebare=0; intrebare<m; intrebare++){
      fscanf(fin, "%d%d", &intrebari[intrebare].x, &intrebari[intrebare].y);
      intrebari[intrebare].x--;
      intrebari[intrebare].y--;
      ordine[intrebare]=&intrebari[intrebare];
    }
    qsort(ordine, m, sizeof(Sir *), comp);
    for(intrebare=0; intrebare<m; intrebare++){
      if(intrebare>0&&ordine[intrebare-1]->x==ordine[intrebare]->x){
        min=ordine[intrebare-1]->rez;
        i=ordine[intrebare-1]->y+1;
      }
      else{
        min=1000000;
        i=ordine[intrebare]->x;
      }
      while(i<=ordine[intrebare]->y){
        if(i%rad==0&&i+rad<=ordine[intrebare]->y){
          if(batog[i/rad]<min)
            min=batog[i/rad];
          i+=rad;
        }
        else{
          if(v[i]<min)
            min=v[i];
          i++;
        }
      }
      ordine[intrebare]->rez=min;

      fprintf(fout,"%d\n",intrebari[intrebare].rez);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}