Cod sursa(job #2251045)

Utilizator iulius510iulius alexandru iulius510 Data 1 octombrie 2018 09:01:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int T[1000000],n,x,y,z,m;
int M;
void ads(int a,int b,int k,int piv)
{
    if(a==k&&b==k)
    {
        T[piv];
        cout<<T[piv];
    }
    else
    {
        if(k<=(a+b)/2)
            ads(a,(a+b)/2,k,2*piv);
        else

            ads((a+b)/2+1,b,k,2*piv+1);
    }


    if(T[piv]<T[2*piv]||T[piv]<T[2*piv+1])
        T[piv]=max(T[2*piv],T[2*piv+1]);

}
void ad(int a,int b,int k,int piv,int x)
{
    if(a==k&&b==k)
    {
        T[piv]=x;
    }
    else
    {
        if(k<=(a+b)/2)
            ad(a,(a+b)/2,k,2*piv,x);
        else

            ad((a+b)/2+1,b,k,2*piv+1,x);
    }
    if(T[2*piv]||T[2*piv+1])
        T[piv]=max(T[2*piv],T[2*piv+1]);

}
void af_max(int a,int b,int y,int z,int piv)
{
    if(a>=y&&b<=z)
        M=max(T[piv],M);
    else

    {
        if((a>=y&&a<=z)||(((a+b)/2>=y)&&(a+b)/2<=z)||(a<=y&&z<=(a+b)/2))
            af_max(a,(a+b)/2,y,z,2*piv);
        if((b>=y&&b<=z)||(((a+b)/2+1)>=y&&((a+b)/2+1)<=z)||(((a+b)/2+1)<=y&&z<=b))
            af_max((a+b)/2+1,b,y,z,2*piv+1);
    }
}
int main()
{
    f>>n>>m;
    for(int i=1; i<=n; i++)
        {
            f>>x;
            ad(1,n,i,1,x);
        }
    for(int j=1; j<=m; j++)
    {
        f>>x>>y>>z;
        if(x==0)
        {
            M=0;
            af_max(1,n,y,z,1);
            g<<M<<"\n";
        }
        else
            ad(1,n,y,1,z);
    }
    return 0;
}