Pagini recente » Cod sursa (job #2079275) | Cod sursa (job #2219898) | Cod sursa (job #2945642) | Cod sursa (job #2127158) | Cod sursa (job #2853857)
#include <fstream>
#include <deque>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <cstring>
#include <climits>
#define MOD 1000000007
using namespace std ;
ifstream cin ("arbint.in") ;
ofstream cout ("arbint.out") ;
struct nod
{
int st, dr, mid, val = 0 ;
nod *fiust, *fiudr ;
};
int query(nod *tatal, int st, int dr)
{
if(st > dr)return -1 ;
if(tatal -> st == st && tatal -> dr == dr)return tatal -> val ;
return max(query(tatal -> fiust, st, tatal -> mid), query(tatal -> fiudr, tatal -> mid + 1, dr)) ;
}
void update(nod *tatal, int poz, int x)
{
if(tatal -> st == tatal -> dr)
{
tatal -> val = x ;
return ;
}
if(poz <= tatal -> mid)update(tatal -> fiust, poz, x) ;
else update(tatal -> fiudr, poz, x) ;
tatal -> val = max(tatal -> fiust -> val, tatal -> fiudr -> val) ;
}
nod tree[400009] ;
void create(int f, int st, int dr)
{
tree[f]. st = st ;
tree[f]. dr = dr ;
tree[f]. mid = (st + dr) / 2 ;
if(st == dr)return ;
tree[f].fiust = &tree[2 * f] ;
tree[f]. fiudr = &tree[2 * f + 1] ;
create(2 * f, st, tree[f]. mid) ;
create(2 * f + 1, tree[f]. mid + 1, dr) ;
}
int v[100009], n ;
int main()
{
int q ;
cin >> n >> q ;
create(1, 1, n) ;
for(int f = 1, a ; f <= n ; f ++)
cin >> a, update(&tree[1], f, a) ;
while(q --)
{
int a, b, c ;
cin >> a >> b >> c ;
if(a == 0)
cout << query(&tree[1], b, c) << '\n' ;
else update(&tree[1], b, c) ;
}
return 0 ;
}