Cod sursa(job #333421)

Utilizator levap1506Gutu Pavel levap1506 Data 22 iulie 2009 18:26:45
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <math.h>
#include <iostream>
using namespace std;
int N,M,interval,i,A[100010],Min[350],t2,a,b,ia,ib,minn;
double t;
int main () {
    ifstream in;
    ofstream out;
    in.open("rmq.in");
    out.open("rmq.out");
    in >> N >> M;
    interval=(int)sqrt(N);
    for (i=1;i<interval+2;i++)
      Min[i]=INT_MAX;
    for (i=1;i<=N;i++)
      {
        in >> A[i];
        t=(double)i/interval;
        if (t>(int)t) t2=(int)t+1; else t2=(int)t;
        if (Min[t2]>A[i]) Min[t2]=A[i];
      }
    for (int x=0; x<M; x++)
    {
        in >> a >> b;
        t=(double)a/interval;
        if (t>(int)t) t2=(int)t+1; else t2=(int)t;
        ia=t2;
        t=(double)b/interval;
        if (t>(int)t) t2=(int)t+1; else t2=(int)t;
        ib=t2;
        if (ia==ib)
         {
             minn=INT_MAX;
             for (i=a;i<=b;i++)
              {
                  if (A[i]<minn) minn=A[i];
              }
             out << minn << "\n";
         }
         else
         {
             minn=INT_MAX;
             for (i=ia+1;i<=ib-1;i++)
               if (Min[i]<minn) minn=Min[i];
             for (i=a;i<=(ia)*interval;i++)
               if (A[i]<minn) minn=A[i];
             for (i=(ib-1)*interval+1;i<=b;i++)
               if (A[i]<minn) minn=A[i];
            out << minn << "\n";
         }
    }
    out.close();
    return 0;
}