Cod sursa(job #1321807)

Utilizator AeroHHorea Stefan AeroH Data 19 ianuarie 2015 15:37:30
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

using namespace std;

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

int p,l,qs,qd,n,v[4*100001],Qtype,val,aux,i,Q,tn;

int query(int as,int ad,int p)
    {
        if (as >  qd || ad < qs)
            return 0;
        if (as >= qs && ad <= qd)
            return v[p];

        int t=(as+ad)>>1,rs=0,rd=0;
        p<<=1;

        if(qs <= t)rs=query(as,t,p);
        if(qd >  t)rd=query(t+1,ad,p+1);
        return max(rs,rd);
    }

int main()
{
    f>>n>>Q;

    aux=n;
    while(aux/=2)++l;
    l+=1;
    tn=1<<l;

    for(i=1;i<=n;++i)
    {
        f>>v[i-1+tn];
    }
    for(i=tn-1;i>0;--i)
    {
        v[i]=max(v[i<<1],v[(i<<1)+1]);
    }

    while(Q--)
    {
        f>>Qtype;
        if(Qtype == 0)
            {
                f>>qs>>qd;
                g<<query(1,tn,1)<<'\n';
            }
        else
            {
                f>>p>>val;
                v[tn+p-1]=val;
                for(i=(tn+p-1)>>1;i>0;i>>=1)
                    v[i]=max(v[i<<1],v[(i<<1)+1]);

            }
    }
    return 0;
}