Cod sursa(job #3037616)

Utilizator marinaoprOprea Marina marinaopr Data 25 martie 2023 22:54:58
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int a[100001],n,t,i,x,y,minim[1001];
int j,lg,radical,cat,rest,nr_int,nr_int1,nr_int2,raspuns;
int main()
{
   fin>>n>>t;
   for(i=1;i<=n;i++)
    fin>>a[i];
   radical=0;
   while(radical*radical<=n)
   {
       radical++;
   }
   radical--;
   lg=radical;
 //  1..lg
  // lg+1..2*lg
  //intervalul j:(j-1)*lg+1...j*lg
   for(j=1;j*lg<=n;j++)
   {
       minim[j]=a[(j-1)*lg+1];
       for(i=(j-1)*lg+2;i<=j*lg;i++)
        if(a[i]<minim[j])
        minim[j]=a[i];
   }
   j--;
   if(j*lg<n)
   {
       j++;
       minim[j]=a[(j-1)*lg+1];
       for(i=(j-1)*lg+2;i<=n;i++)
        if(a[i]<minim[j])
         minim[j]=a[i];
   }
   nr_int=j;
//   fin>>t;
   for(i=1;i<=t;i++)
   {
       fin>>x>>y;
       if(y-x+1<lg)
       {
           raspuns=a[x];
           for(j=x+1;j<=y;j++)
            if(a[j]<raspuns)
             raspuns=a[j];
       }
       else
       {
           //caut primul capat stanga mai mare sau egal ca x
           cat=x/lg;
           rest=x%lg;
           if(rest!=0) nr_int1=cat+2;
           else nr_int1=cat+1;
           //caut ultimul capat dreapta <=y
           cat=y/lg;
           rest=y%lg;
           nr_int2=cat;
      //     if(x==5&&y==9)
          //  cout<<nr_int1<<" "<<nr_int2;
           if(nr_int1<=nr_int2)
           {
               raspuns=a[x];
               for(j=x+1;j<=(nr_int1*lg);j++)
                if(a[j]<raspuns)
                raspuns=a[j];
               for(j=nr_int2*lg+1;j<=y;j++)
                if(a[j]<raspuns)
                raspuns=a[j];
               for(j=nr_int1;j<=nr_int2;j++)
                if(minim[j]<raspuns)
                raspuns=a[j];
           }
           else
           {
               raspuns=a[x];
               for(j=x+1;j<=y;j++)
                if(a[j]<raspuns)
                raspuns=a[j];
           }


       }
       fout<<raspuns<<'\n';
   }
    return 0;
}