Cod sursa(job #2249494)

Utilizator iulius510iulius alexandru iulius510 Data 29 septembrie 2018 22:47:44
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int T[100],n,x,y,z,A[100],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))
             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))
            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 i=1;i<=m;i++)
   {   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;
}