Pagini recente » Cod sursa (job #292240) | Cod sursa (job #1219349) | Borderou de evaluare (job #176075) | Borderou de evaluare (job #2912077) | Cod sursa (job #936611)
Cod sursa(job #936611)
#include<fstream>
#define In "arbint.in"
#define Out "arbint.out"
#define max(a,b) (((a)>=(b))?(a):(b))
#define Fiu_st(nod) (nod<<1)
#define Fiu_dr(nod) ((nod<<1)+1)
#define Nmax 100000
using namespace std;
int arb[Nmax*17];//17=log2(Nmax)
int val, poz, a, b;
inline void Update(int nod,int st,int dr)
{
if(st==dr)//interval elementar
{
arb[nod] = val;
return;
}
int mijl = (st+dr)>>1;
if(poz<=mijl)//daca fiul din stanga contine pozitia poz
Update(Fiu_st(nod),st,mijl);//actualizare fiu stanga
else
Update(Fiu_dr(nod),mijl+1,dr);//actualizare fiu dreapta
arb[nod] = max(arb[Fiu_st(nod)],arb[Fiu_dr(nod)]);
//actualizam nodul in fuctie de cei doi fii
}
//returneaza maximul din intervalul [st,dr]
inline int Query(int nod,int st,int dr)
{
if(a<=st && dr<=b)
return arb[nod];
int max1=0,max2=0,mijl = (st+dr)>>1;
if(a<=mijl)//primul fiu contine o parte din primul interval
max1 = Query(Fiu_st(nod),st,mijl);
if(mijl<b)//al doi-lea fiu contine o parte din interval
max2 = Query(Fiu_dr(nod),mijl+1,dr);
return max(max1,max2);
}
int main()
{
int i,n,m,op;
ifstream f(In);
ofstream g(Out);
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>val;
poz = i;
Update(1,1,n);
}
while(m--)
{
f>>op>>a>>b;
if(op==0)
g<<Query(1,1,n)<<"\n";
else
{
poz = a;
val = b;
Update(1,1,n);
}
}
f.close();
g.close();
return 0;
}