Cod sursa(job #1043951)

Utilizator tudor.rotarusTudor Rotarus tudor.rotarus Data 29 noiembrie 2013 02:54:21
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>

using namespace std;

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

double v[1000000],s[10000000000],maxim;

void create(int poz,int st,int dr)
{int m;
    if(st==dr)
    {
        s[poz]=v[st];
    }
    else
    {
        m=(st+dr)/2;
        create(poz*2,st,m);
        create(poz*2+1,m+1,dr);
        s[poz]=max(s[poz*2],s[poz*2+1]);
    }
}

void modif(int poz,int st,int dr,int a,int b)
{int m;
    if(st==dr)
    {
        s[poz]=b;
    }
    else
    {
        m=(st+dr)/2;
        if(a<=m)
        {
            modif(poz*2,st,m,a,b);
        }
        else
        {
            modif(poz*2+1,m+1,dr,a,b);
        }
        s[poz]=max(s[poz*2],s[poz*2+1]);
    }
}

void interval(int poz,int st,int dr,int a,int b)
{int m;
    if(st>=a && dr<=b)
    {
        if(maxim<s[poz])
            maxim=s[poz];
    }
    else
    {
        if(st!=dr)
        {
            m=(st+dr)/2;
            if(m<a)
                interval(poz*2+1,m+1,dr,a,b);
            else
                if(m>=b)
                    interval(poz*2,st,m,a,b);
                else
                {
                    interval(poz*2,st,m,a,b);
                    interval(poz*2+1,m+1,dr,a,b);
                }
        }
    }

}


int main()
{int i,n,m,x,y,z;

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

    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        if(x==1)
        {
            modif(1,1,n,y,z);
        }
        else
        {
            maxim=-366;
            interval(1,1,n,y,z);
            g<<maxim<<"\n";
        }
    }


    return 0;
}