Pagini recente » Cod sursa (job #2408620) | Cod sursa (job #1717201) | Cod sursa (job #300895) | Cod sursa (job #782958) | Cod sursa (job #2612212)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct node{
node* st = nullptr;
node* dr = nullptr;
int val = 0, a, b;
};
void constr( node* p, int a, int b) {
if( a < b ){
p->st = new node;
constr( p->st, a, ( a + b ) / 2);
p->dr = new node;
constr ( p->dr, (a+b)/2 + 1, b);
}
p->a = a;
p->b = b;
}
void schimbare_val(node* p, int a, int val){
if( p -> a == p -> b && p->a == a){
p-> val = val;
} else {
if (a <= ( p -> a + p-> b) / 2)
schimbare_val( p-> st, a, val);
else
schimbare_val(p->dr, a, val);
p-> val = max( p->st->val, p->dr->val);
}
}
int interogare( node * p, int a, int b ){
if( p-> a == a && p-> b == b)
return p-> val;
int mij = (p->a + p->b) / 2;
if( mij >= b){
/*if( p->st == NULL )
return p->val;
else*/
return interogare( p->st, a, b);
}
if( mij < a){
/* if( p-> dr == NULL)
return p->val;
else*/
return interogare( p->dr, a, b);
}
return max( interogare( p->st, a, mij), interogare( p->dr, mij+1, b));
}
void distrug( node * p){
if( p-> st != nullptr)
distrug( p->st);
if( p-> dr != nullptr)
distrug( p->dr);
delete(p);
}
int main()
{
ifstream in ("arbint.in");
ofstream out ("arbint.out");
int N, M;
in >> N >> M;
node * arb = new node;
constr( arb, 0, N-1);
int v[N];
for( int i = 0; i < N; i++){
in >> v[i];
schimbare_val( arb, i, v[i]);
}
while( M != 0){
int q, a, b;
in >> q >> a >> b;
if( q == 0){
out << interogare( arb, a-1, b-1) << "\n";
}
else{
schimbare_val ( arb, a-1, b);
}
M--;
}
distrug(arb);
return 0;
}