Pagini recente » Cod sursa (job #100703) | Cod sursa (job #2571054) | Cod sursa (job #1675294) | Cod sursa (job #2945038) | Cod sursa (job #2863268)
#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int heap[400002];
int x,y,n,k;
int maxi;
void update (int nod, int begining, int ending ,int val ,int pos)
{
if (ending==begining)
{
heap[nod]=val;
return ;
}
else
{
int mijloc=begining+ending;
mijloc/=2; //mijlocul segmentului
int st=2*nod; //fiul din stanga
int dr=st+1; //fiul din dreapta
if (pos<=mijloc)
update (st,begining,mijloc,val,pos); // parcugem pe fiul din stanga
else
update (dr,mijloc+1,ending,val,pos); //parcugem pe fiul din dreapta
heap[nod]=max(heap[st],heap[dr]); //comparam fii
}
}
void query (int nod,int begining, int ending)
{
if (x<= begining && y>=ending)
{
maxi=max(maxi,heap[nod]);
}
else
{
int mijloc=(begining+ending)/2; //mijlocul intervalului
int st=2*nod; //fiul din stanga
int dr=st+1; //fiul din dreapta
if (x<=mijloc) //x trece peste fiul din stanga
query(st,begining,mijloc); //mergem prin fiul din stanga
if (y>mijloc)
query(dr,mijloc+1,ending); //mergem prin fiul din dreapta
}
}
int main()
{
cin>>n>>k;
for (int i=1;i<=n;i++)
{
int valoare;
cin>>valoare;
update (1,1,n,valoare,i);
}
for (int i=1;i<=k;i++)
{
int c;
maxi=0;
cin>>c>>x>>y;
if (c==1)
{
update (1,1,n,y,x);
}
else
{
query(1,1,n);
cout<<maxi<<'\n';
}
}
}