Cod sursa(job #1740139)

Utilizator antracodRadu Teodor antracod Data 10 august 2016 22:28:58
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

long int arb[500001];

const int INF=(1<<30);

void update(int x,int y)
{
    arb[x]=y;
    while(x!=1)
    {
        x=x/2;
        arb[x]=max(arb[x*2],arb[x*2+1]);
    }
}

int query(int ql,int qr,int node,int nl,int nr)
{
    if(nl>=ql && nr<=qr)
    {
        return arb[node];
    }
    else if(nr<ql || nl>qr)
    {
        return -INF;
    }
    else
    {
        int a,b;
        a=query(ql,qr,node*2,nl,(nr+nl)/2);
        b=query(ql,qr,node*2+1,(nr+nl)/2+1,nr);
        return max(a,b);
    }

}
int main()
{
    int op,n,n2;
    int i;
    in>>n>>op;

    for(n2=1; n2<n; n2*=2)
    {}

    for(i=n2; i<=n2+n-1; i++)
    {
        in>>arb[i];
    }
    for(i=n+n2; i<n2*2; i++)
    {
        arb[i]=-INF;
    }
    for(i=n-1; i>0; i--)
    {
        arb[i]=max(arb[i*2],arb[i*2+1]);
    }

    for(i=1; i<=op; i++)
    {
        int x,y,k;
        in>>k>>x>>y;
        if(k==1)
        {
            update(n2+x-1,y);
        }
        else
        {
            out<<query(x,y,1,1,n2)<<'\n';
        }
    }
    return 0;
}