Pagini recente » Cod sursa (job #2443811) | Cod sursa (job #80982) | Cod sursa (job #3266115) | Cod sursa (job #472125) | Cod sursa (job #3143224)
#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N = 270000;
int n,p,q,t,x,y,a[N];
int getMax(int nod,int st,int dr)
{
/// interval controlat de nod [st,dr]
/// interval chestionat [x,y]
if( x <=st && dr <= y) /// cazul cand [st,dr] inclus in [x,y]
return a[nod]; /// ma intereseaza maximul de pe tot intervalul [st,dr] -> a[nod]
if( y < st || dr < x ) /// cazul cand [st,dr] si [x,y] sunt disjuncte
return 0; /// nu ma intereseaza nimic din intervalul [st,dr]
int mi=(st+dr)/2;
return max(getMax(2*nod,st,mi),getMax(2*nod+1,mi+1,dr));
}
void updMax(int nod,int val)
{
a[nod]=val;///modificam valoarea la ultimul nivel
nod/=2;/// ne mutam pe nivelul tatalui
while(nod)/// se parcurge lantul de la tata pana la radacina
{
a[nod]=max(a[2*nod],a[2*nod+1]);///recalculam valoarea din nod
nod/=2;///ne mutam la tata
}
}
int main()
{
f>>n>>q;
p=1;
while(p<n)p*=2;
for(int i=1;i<=n;i++)
f>>a[i+p-1];
for(int i=p-1;i>=1;i--)
a[i]=max(a[2*i],a[2*i+1]);
for(;q;q--) /// acest for va face exact q repetitii
{
f>>t>>x>>y;
if(t==0)
g<<getMax(1,1,p)<<'\n';
else
updMax(x+p-1,y);
}
return 0;
}