Cod sursa(job #1580700)

Utilizator aetherAlexandra Vanca aether Data 26 ianuarie 2016 00:41:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 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];
        return max(query(as,(as+ad)>>1,p<<1),query((((as+ad)>>1)+1),ad,(p<<1)+1));
    }

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]);
    }

    for(int k=1;k<=Q;++k)
    {
        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;
}