Cod sursa(job #1148524)

Utilizator denis_tdrdenis tdr denis_tdr Data 20 martie 2014 21:01:13
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <math.h>
#define nMax 100001
using namespace std;
int n, m, i, j, min1, s, c, v[nMax], r[320];
int main(){
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    f>>n>>m;
    min1=nMax; s=sqrt(n);
    c=1;
    for(int i=1;i<=n;i++){
        f>>v[i];
        min1=min(min1, v[i]);
        if(i%s==0)
            r[i/s]=min1, min1=nMax;
    }
    r[s+1]=min1;
    /*for(int i=1;i<=s+1;i++)
        g<<r[i]<<" ";
    */
    int c1=0, c2=n/s+1;
    for(int k=0;k<m;k++){
        f>>i>>j;
        //cout<<i<<" "<<j<<"\n";
        c1=0, c2=n/s+1;
        while(c1*s<i)c1++;
        while(c2*s>j)c2--;
        //cout<<c1<<" "<<c2<<"\n";

        if(c1>c2)
            g<<r[c1]<<"\n";
            //cout<<"->"<<r[c1];
        min1=v[i];
        if(c1==c2){
        for(;i<=j;i++)min1=min(min1, v[i]);
        g<<min1<<"\n";
        //cout<<"->"<<min1;
        }
        if(c1<c2){
            min1=v[i];
            for(;i<=c1*s;i++)
                min1=min(min1, v[i]);
            for(;j>=c2*s;j--)
                min1=min(min1, v[j]);
            c1++;
            for(;c1<=c2;c1++)
                min1=min(min1, r[c1]);
            //cout<<"->"<<min1;
            g<<min1<<"\n";
        }

        //cout<<"\n------\n";
    }



    return 0;
}