Cod sursa(job #1184400)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 12 mai 2014 16:14:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
long n,i,j,t,x,y,mx,m,nr,v[600005];
void up(long nd)
{
    if (v[nd]>v[nd/2] && nd!=1)
    {
        v[nd/2]=v[nd];
        up(nd/2);
    }
}
void maxim(long nd,long st,long dr,long x,long y)
{
    long mid;
        mid=(st+dr)/2;
    if(x<=st && y>=dr)
    {
        if (v[nd]>mx)
            mx=v[nd];
    }
    else
    {
        if (x<=mid)
            maxim(nd*2,st,mid,x,y);
        if (y>=mid+1)
            maxim(nd*2+1,mid+1,dr,x,y);
    }
}
void up2(long nd)
{
    if (nd!=1)
    {
        if (nd%2==1)
        {
            if (v[nd]>=v[nd-1])
                v[nd/2]=v[nd];
            else
                v[nd/2]=v[nd-1];
            up2(nd/2);
        }
        else
        {
            if (v[nd]>=v[nd+1])
                v[nd/2]=v[nd];
            else
                v[nd/2]=v[nd+1];
            up2(nd/2);
        }
    }
}
int main()
{
    f>>n>>m;
    nr=1;
    while (nr<n)
        nr*=2;
    for (i=1;i<=n;i++)
    {
        f>>x;
        v[nr+i-1]=x;
        up(nr+i-1);
    }
    for (i=1;i<=m;i++)
    {
        f>>t>>x>>y;
        if (t==1)
        {
            v[nr+x-1]=y;
            up2(nr+x-1);
        }
        else
        {
            mx=0;
            maxim(1,1,nr,x,y);
            g<<mx<<'\n';
        }
    }
    f.close();
    g.close();
    return 0;
}