Cod sursa(job #1081857)

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

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;
    fin>>n>>m;
    cn=n;
    if(cn&(cn-1))
    {
        while(cn&(cn-1))
        {
            cn&=(cn-1);
        }
        cn<<=1;
    }
    for(i=1;i<=n;i++)
    {
        fin>>x;
        update(cn-1+i, x);
    }
    while(m--)
    {

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