Cod sursa(job #804116)

Utilizator ericptsStavarache Petru Eric ericpts Data 28 octombrie 2012 21:19:16
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <cstdio>
#include <cstdlib>

using namespace std;

char *buffer;
int arb[1<<18];

inline int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}

void update(int nod,int st,int dr,int p,int v)
{
    if(st == dr)
        arb[nod] = v;
    else
    {
        int mij = (st+dr)/2;
        if(p <= mij)
            update(nod*2,st,mij,p,v);
        else
            update(nod*2+1,mij+1,dr,p,v);
        arb[nod] = max(arb[nod*2],arb[nod*2+1]);
    }
}


int query(int nod,int st,int dr,int a,int b)
{
    if(a <= st && dr <= b)
        return arb[nod];
    int mij = (st+dr)/2;
    int s1=0,s2=0;
    if(a <= mij)
        s1 = query(nod*2,st,mij,a,b);
    if(b > mij)
        s2 = query(nod*2+1,mij+1,st,a,b);
    return max(s1,s2);
}


void scan(int &n)
{
    while(*buffer < '0' || *buffer >'9')
        ++buffer;
    n^=n;
    while(*buffer >='0' && *buffer <='9')
        n = n*10+*(buffer++)-'0';
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int size;
    fseek(stdin,0,SEEK_END);
    size = ftell(stdin);
    buffer = (char*) malloc(size);
    rewind(stdin);
    fread(buffer,1,size,stdin);
    int n,m;
    int o,a,b,i;
    scan(n);
    scan(m);
    for(i=1;i<=n;++i)
    {
        scan(a);
        update(1,1,n,i,a);
    }
    while(m--)
    {
        scan(o),scan(a),scan(b);
        if(o)
            update(1,1,n,a,b);
        else
            printf("%d\n",query(1,1,n,a,b));
    }
    return 0;
}