Cod sursa(job #1746298)

Utilizator denniscrevusDennis Curti denniscrevus Data 23 august 2016 00:36:04
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#define NMAX 100005

using namespace std;

int v[NMAX], arb[3*NMAX], i,n,m,car,a,b,ans,aux;

void update(const int &st, const int &dr, const int &poz, const int &nod )
{
    if(st==dr)
    {
        arb[nod]=v[poz];
        return;
    }
    int sfiu = (nod<<1);
    int dfiu = ((nod<<1)+1);
    int mij = ((st+dr)>>1);
    if(poz<=mij) update(st,mij,poz,sfiu);
    if(poz>mij) update(mij+1,dr,poz,dfiu);
    arb[nod] = max(arb[sfiu], arb[dfiu]);
}

int querry(const int &st, const int &dr, const int &st1, const int &dr1, const int &nod)
{
    if(st==st1 && dr==dr1)
        return arb[nod];
    int sfiu=(nod<<1);
    int dfiu=((nod<<1)|1);
    int mij=((st+dr)>>1);
    if(dr1<=mij)
        return querry(st,mij,st1,dr1,sfiu);
    if(st1>mij)
        return querry(mij+1,dr,st1,dr1,dfiu);
    return max(querry(st,mij,st1,mij,sfiu), querry(mij+1,dr,mij+1,dr1,dfiu));
}

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

    f>>n>>m;

    for(i=1;i<=n;i++)
    {
        f>>v[i];
        update(1,n,i,1);
    }

    /*for(i=1;i<=3*n;i++)
        g<<arb[i];
    */

    for(i=1;i<=n;i++)
    {
        f>>car>>a>>b;
        if(car==0)
        {
            ans=querry(1,n,a,b,1);
            g<<ans<<"\n";
        }
        if(car==1)
        {
            v[a]=b;
            update(1,n,a,1);
        }
    }
}