Cod sursa(job #3146162)

Utilizator Tibi201eweREWR Tibi201 Data 18 august 2023 20:53:58
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
FILE *fin, *fout;

int rmq[100001][20],v[20];

int main()
{
    int n,m,i,put,exp,intrebare,x,y,log,a,cf;
    char c;
    fin=fopen("rmq.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    fgetc(fin);
    for(i=0; i<n; i++){
      a=0;
      c=fgetc(fin);
      while(c!='\n'){
        a=a*10+c-'0';
        c=fgetc(fin);
      }
      rmq[i][0] = a;
    }
    exp=1;
    for(put=2; put<n; put*=2){
      for(i=0; i<n; i++){
        if(i+put<n)
          rmq[i][exp]=rmq[i][exp-1]<rmq[i+put/2][exp-1]?rmq[i][exp-1]:rmq[i+put/2][exp-1];
      }
      exp++;
    }
    fout=fopen("rmq.out", "w");
    for(intrebare=0; intrebare<m; intrebare++){
      c=fgetc(fin);
      x=y=0;
      while(c!=' '){
        x=x*10+c-'0';
        c=fgetc(fin);
      }
      c=fgetc(fin);
      while(c!='\n'){
        y=y*10+c-'0';
        c=fgetc(fin);
      }
      x--;
      y--;
      i=x;
      log=31-__builtin_clz(y-x+1);
      put=1<<log;
      a=rmq[x][log]<rmq[y-put+1][log]?rmq[x][log]:rmq[y-put+1][log];
      cf=20;
      do{
        v[--cf]=a%10;
        a/=10;
      }while(a>0);
      while(cf<20){
        fputc(v[cf++]+'0', fout);
      }
      fputc('\n', fout);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}