Cod sursa(job #1802068)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 9 noiembrie 2016 20:36:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <algorithm>
#define buff_size 1000000
using namespace std;
FILE*f=freopen("arbint.in","r",stdin);
FILE*g=freopen("arbint.out","w",stdout);
char buff[buff_size],buffw[buff_size]="";
int arb[200001];
int pos=0,posw=0;

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


int main() {


    int n,q,i;
    int t,st,dr;
    int rez;
    fread(buff,  buff_size,1, 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]);

   for (i=1;i<=q;++i) {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;
            }
            posw += sprintf(buffw + posw,"%d\n",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(buffw, posw, 1, stdout);

}