Cod sursa(job #1895008)

Utilizator Garen456Paun Tudor Garen456 Data 27 februarie 2017 18:42:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#define nmax 100050
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int Narb,aint[4*nmax];
inline void change(int p,int x)
{ int t;
    p+=Narb-1;
    aint[p]=x;

    while(p>0)
    {   if(p%2==1) p--;
        t=p/2;
        aint[t]=max(aint[p],aint[p+1]);
        p=t;
    }
}
inline int Query(int p,int x,int y,int st,int dr)
{
    if(x==st && y==dr) return aint[p];
    int mij=(st+dr)/2;
    if(y<=mij)
        return Query(2*p,x,y,st,mij);
    if(x>mij)
        return Query(2*p+1,x,y,mij+1,dr);

    return max( Query(2*p,x,mij,st,mij) , Query (2*p+1,mij+1,y,mij+1,dr)  );
}

int main()
{  int n,i,q,op,x,y;
    fin>>n>>q;
    Narb=1;
    while(Narb<n) Narb*=2;
    for(i=1;i<=n;++i)
        fin>>aint[Narb+i-1];
    for(i=Narb-1;i>=1;i--)
      aint[i]=max(aint[i*2],aint[i*2+1]);

    for(i=1;i<=q;++i)
    { fin>>op>>x>>y;
        if(op==0)
           fout<<Query(1,x,y,1,Narb)<<"\n";
       else change(x,y);
    }

    return 0;
}