Cod sursa(job #1081869)

Utilizator sebinechitasebi nechita sebinechita Data 13 ianuarie 2014 22:22:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
using namespace std;
ofstream fout("arbint.out");
#define MAX 300010

FILE *fin=fopen("arbint.in", "r");

unsigned const maxb=8192;
char buf[maxb];
int ptr=maxb-1;

int getInt()
{
    int nr=0;
    while(buf[ptr]>'9' || buf[ptr]<'0')
    {
        if(++ptr>=maxb)
            fread(buf, maxb, 1, fin), ptr=0;
    }
    while(buf[ptr]<='9' && buf[ptr]>='0')
    {
        nr=nr*10+buf[ptr]-'0';
        if(++ptr>=maxb)
            fread(buf, maxb, 1, fin), ptr=0;
    }

    return nr;
}


int arb[MAX];
int a, b;
void update(int nod, int val)
{
    arb[nod]=val;
    nod>>=1;
    while(nod)
    {
        arb[nod]=max(arb[nod*2], arb[nod*2+1]);
        nod>>=1;
    }
}

int query(int nod, int st, int dr)
{
    if(a<=st && dr<=b)
    {
        return arb[nod];
    }
    if(dr<a || b<st)
        return 0;

    int mid=(dr+st)>>1;
    return max(query(nod<<1, st, mid), query((nod<<1)+1, mid+1, dr));
}

int main()
{
    int n, m, cn, i, x, y;
    n=getInt();
    m=getInt();
    cn=n;
    if(cn&(cn-1))
    {
        while(cn&(cn-1))
        {
            cn&=(cn-1);
        }
        cn<<=1;
    }
    for(i=1;i<=n;i++)
    {
        x=getInt();
        update(cn-1+i, x);
    }
    while(m--)
    {

        int tip;
        tip=getInt();
        if(tip)
        {
            x=getInt();
            y=getInt();
            update(cn-1+x, y);
        }
        else
        {
            a=getInt();
            b=getInt();
            fout<<query(1, 1, cn)<<"\n";
        }
    }
    fout.close();
}