Pagini recente » Cod sursa (job #1314772) | Cod sursa (job #2241731) | Cod sursa (job #2944643) | Cod sursa (job #1192091) | Cod sursa (job #2764888)
#include <fstream>
#include <deque>
#define MOD 666013
using namespace std;
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
struct nod
{
int a, b, val = 0 ;
nod *st, *dr ;
};
int v[100009] ;
nod *creeaza(nod *&head, int st, int dr)
{
head = new nod ;
if(st == dr)
{
head -> a = st ;
head -> b = st ;
head -> val = v[st] ;
return head ;
}
head -> st = creeaza(head -> st, st, st + (dr - st) / 2) ;
head -> dr = creeaza(head -> dr, st + (dr - st) / 2 + 1, dr) ;
head -> a = st ;
head -> b = dr ;
head -> val = max(head -> st -> val, head -> dr -> val) ;
return head ;
}
int check(nod *head, int st, int dr)
{
if(head -> a == st &&
head -> b == dr)
return head -> val ;
if(dr <= head -> st -> b)
return check(head -> st, st, dr) ;
if(st >= head -> dr -> a)
return check(head -> dr, st, dr) ;
return max(check(head -> st, st, head -> st -> b),
check(head -> dr, head -> dr -> a, dr));
}
void update(nod *head, int poz, int x)
{
if(head -> a == poz &&
head -> b == poz)
{
head -> val = x ;
v[poz] = x ;
return ;
}
if(poz <= head -> st -> b)
{
update(head -> st, poz, x) ;
head -> val = max(head -> st -> val, head -> dr -> val) ;
return ;
}
update(head -> dr, poz, x) ;
head -> val = max(head -> st -> val, head -> dr -> val) ;
return ;
}
int main()
{
int n, q ;
cin >> n >> q ;
for(int f = 1 ; f <= n ; f ++)
cin >> v[f] ;
nod *head ;
creeaza(head, 1, n) ;
while(q --)
{
int a, b, c ;
cin >> a >> b >> c ;
if(a == 0)
{
cout << check(head, b, c) << '\n' ;
}
else update(head, b, c) ;
}
return 0 ;
}
/*
5
abade
1 2
1 4
2 4
*/