Cod sursa(job #1784797)

Utilizator teo.cons98Constantin Teodor-Claudiu teo.cons98 Data 20 octombrie 2016 15:18:28
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m, q, minim = 0x7fffffff, left1, right1, nr;
char c[1000000];
int v[100001], A[1000];

int interval()
{
    minim = 0x7fffffff;
    while(left1 <= right1)
    {
        if(left1 % nr != 0 or ((left1 + nr) > right1))
        {
            if(v[left1] < minim)
            {
                minim = v[left1];
            }
            ++left1;
        }
        else
        {
            if(A[left1 / nr] < minim)
            {
                minim = A[left1 / nr];
            }
            left1 += nr;
        }
    }
    return minim;
}

int main()
{
    fin>>n>>m;
    int l = sqrt(n),length;
    int j = 0, i1;
    nr = l;
    if(n % l != 0)
    {
        l++;
    }

    fin.read(c,100000);
    length = strlen(c);

    for( i1 = 1; i1 <= length; ++i1)
    {
        if(c[i1] >= '0' and c[i1] <= '9')
        {
            v[j]*=10;
            v[j] += int(c[i1]) - 48;
        }
        else
        {
            j++;
            if(j>=n) break;
        }
    }
    ++i1;

    for(int i = 0; i < n; ++i)
    {
        //fin>>v[i];
        q = i / nr;
        if(i % nr == 0)
        {
            A[q - 1] = minim;
            minim = 0x7fffffff;

        }
        if(v[i] < minim)
        {
            minim = v[i];
        }
    }
    A[q] = minim;

    for(int i = 1; i <= m; ++i)
    {
        //fin>>left1>>right1;
        left1 = 0;
        right1 = 0;
        while(c[i1] >= '0' and c[i1] <= '9')
        {
            left1 *= 10;
            left1 += int(c[i1]) - 48;
            ++i1;
        }
        ++i1;

        while(c[i1] >= '0' and c[i1] <= '9')
        {
            right1 *= 10;
            right1 += int(c[i1]) - 48;
            ++i1;
        }
        ++i1;

        --left1;
        --right1;
        fout<<interval()<<"\n";
    }
}