Cod sursa(job #2345980)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 16 februarie 2019 22:00:21
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <cstdio>
#include <iostream>

#define NMAX 100005
using namespace std;

int Arbore[4 * NMAX], minn;

void UpdateArb(int nod, int val, int st, int dr, int poz){
    if(st == dr){
        Arbore[nod] = val;
        return;
    }

    int mij = (st + dr) / 2;
    if(poz <= mij)
        UpdateArb(2* nod, val, st, mij, poz);
    else UpdateArb(2 * nod + 1, val, mij + 1, dr, poz);

    Arbore[nod] = min(Arbore[nod * 2], Arbore[nod * 2 + 1]);
}

void Query(int nod, int st, int dr, int stanga, int dreapta){
    if(stanga <= st && dr <= dreapta){
        if(Arbore[nod] < minn)
            minn = Arbore[nod];
        return;
    }

    int mij = (st + dr) / 2;
    if(stanga <= mij)
        Query(2 * nod, st, mij, stanga, dreapta);
    if(mij < dreapta)
        Query(2 * nod + 1, mij + 1, dr, stanga, dreapta);
}

const int buffer = 655536;
int poz = buffer;
char buff[buffer + 1];

char getChar(){
    if(poz == buffer){
        fread(buff, 1, buffer, stdin);
        poz = 0;
    }
    return buff[poz++];
}

int readInt(){
    int num = 0;
    char ch = getChar();
    while(1){
        if(ch == ' ' || ch == '\n')
            break;
        num = num * 10 + (ch - '0');
        ch = getChar();
    }
    return num;
}

char afis[50005];
int sp = 0;

void write_ch(char ch){
    if(sp == 50005){
        fwrite(afis, 1, 50005, stdout);
        sp = 0;
    }
    afis[sp++] = ch;
}

void write(int x){
    int inv = 0;
    while(x){
        inv = inv * 10 + (x % 10);
        x /= 10;
    }
    while(inv){
        write_ch(inv % 10 + '0');
        inv /= 10;
    }
    write_ch('\n');
}
void remain(){
    fwrite(afis, 1, sp, stdout);
}

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    int n, m;
    n = readInt();
    m = readInt();

    for(int i = 1; i <= n; ++i){
        int x;
        x = readInt();

        UpdateArb(1, x, 1, n, i);
    }

    for(int i = 1; i <= m; ++i){
        int x, y;
        x = readInt();
        y = readInt();

        minn = (1 << 30);
        Query(1, 1, n, x, y);
        write(minn);
    }
    remain();
    return 0;
}