Cod sursa(job #600068)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 30 iunie 2011 15:38:19
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int b[10000000];

int a[100010],n,m,i,c,x,y;

void creare_arb(int l, int r, int p)
{
    if (l==r) b[p]=a[l];
    else
    {
        int mij=(l+r)/2;
        creare_arb(l,mij,p*2);
        creare_arb(mij+1,r,p*2+1);
        b[p]=max(b[p*2],b[p*2+1]);
    }
}

int maxim(int l, int r, int p, int x, int y)
{
    if (l==x && r==y) return b[p];
    else
    {
        int mij=(l+r)/2;
        if (y<=mij) return maxim(l,mij,p*2,x,y);
        else if (x>mij)return maxim(mij+1,r,p*2+1,x,y);
        else return max(maxim(l,mij,p*2,x,mij),maxim(mij+1,r,p*2+1,mij+1,y));
    }
}

void modifica(int l, int r, int p, int x, int val)
{
    if (l==r && l==x) b[p]=val;
    else
    {
        int mij=(l+r)/2;
        if (x<=mij) modifica(l,mij,p*2,x,val);
        else modifica(mij+1,r,p*2+1,x,val);
        b[p]=max(b[2*p],b[2*p+1]);
    }
}

int main()
{
    f >> n >> m;
    for (i=1; i<=n; i++)
        f >> a[i];
    creare_arb(1,n,1);
    for (i=m;i--;)
    {
        f >> c >> x >>y;
        if (c==0) g << maxim(1,n,1,x,y) << "\n";
        else
            modifica(1,n,1,x,y);
    }
}