Cod sursa(job #1802104)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 9 noiembrie 2016 21:08:03
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>

#define buff_size 666666
using namespace std;
FILE*f=freopen("arbint.in","r",stdin);
FILE*g=freopen("arbint.out","w",stdout);
char buff[buff_size];
int arb[200001];
int pos=0;

inline void read(int &nr)
{
    while(buff[pos] < '0' || buff[pos] > '9') if(++pos == buff_size) fread(buff,  1,buff_size, stdin), pos = 0;
    nr = 0;
    while('0' <= buff[pos] && buff[pos] <= '9')
    {
        nr = (nr<<1)+(nr<<3)+ buff[pos] - '0';
        if(++pos == buff_size) fread(buff, 1, buff_size, stdin), pos = 0;
    }
}
char outBuff[buff_size];
int outPtr;

inline void putChar(const char &C) {
    outBuff[outPtr++] = C;
    if (outPtr == buff_size) {
        fwrite(outBuff, 1, buff_size, stdout);
        outPtr = 0;
    }
}

inline  void write(int X) {
    char digs[10];
    int n = 0, q;
    do {
        q = X / 10;
        digs[n++] = X - (q << 1) - (q << 3) + '0';
        X = q;
    } while (X);
    while (n--) {
        putChar(digs[n]);
    }
    putChar('\n');
}
int main() {


    int n,q,i;
    int t,st,dr;
    int rez;
    fread(buff, 1, buff_size, stdin);
    read(n);read(q);
    for (i=0;i<n;++i) read(arb[i+n]);

    for (i=n-1;i;--i)      arb[i] = max( arb[i<<1],arb[(i<<1)|1]);

    while(q--) {read(t);

        if (t==0)
        {
            read(st);read(dr);st+=n-1;dr+=n-1;
            rez = 0;
            while (st <= dr) {
                rez = max(rez, max(arb[st], arb[dr]));
                st = (st + 1) >> 1;
                dr = (dr - 1) >> 1;
            }
            write(rez);
        }
        else{
            read(dr);dr+=n-1;read(arb[dr]);

            while (dr > 1) {
                st = dr >> 1;
                arb[st] = max(arb[dr], arb[dr ^ 1]);
                dr = st;
            }
        }
    }
     fwrite(outBuff, 1, outPtr, stdout);

}