Pagini recente » Cod sursa (job #1511097) | Cod sursa (job #1937180) | Cod sursa (job #1678168) | Cod sursa (job #1511102) | Cod sursa (job #2407005)
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
#define Maxim(a, b) ((a > b)? a : b)
#define nMax 100005
int N, M;
int Arb[4 * nMax + 66];
int start, finish, Val, Pos, maxim;
void Update(int, int, int);
void Query(int, int, int);
int main(){
fin >> N >> M;
//Citire si creare arbore
for(int i = 1; i <= N; ++i){
int x;
fin >> x;
Pos = i;
Val = x;
Update(1, 1, N);
}
for(int i = 1; i <= M; ++i){
int x, A, B;
fin >> x >> A >> B;
if(x == 0){ //Determina maximul din intervalul [A, B]
maxim = -1; // (maximul dintre valorile Ai cu a ≤ i ≤ b).
start = A;
finish = B;
Query(1, 1, N);
fout << maxim << "\n";
}
else if(x == 1){ //Valoarea elementului de pe pozita a va deveni b.
Pos = A;
Val = B;
Update(1, 1, N);
}
}
fin.close();
fout.close();
return 0;
}
/*
* Functia Update() are rolul de a contrui arborele de intervale si sa-l actualizeze.
*/
void Update(int nod, int left, int right){
if(left == right){
Arb[nod] = Val;
return;
}
int mijloc = (left+right) / 2;
if(Pos <= mijloc)
Update(2*nod, left, mijloc);
else
Update(2*nod+1, mijloc+1, right);
Arb[nod] = Maxim(Arb[2*nod], Arb[2*nod+1]);
}
/*
* Functia Query() are rolul de a determina lungimea maxima din intervalul [start, finish].
*/
void Query(int nod, int left, int right){
if(start <= left && right <= finish){
maxim = Maxim(maxim, Arb[nod]);
return;
}
int mijloc = (left+right) / 2;
if(start <= mijloc)
Query(2*nod, left, mijloc);
if(finish > mijloc)
Query(2*nod+1, mijloc+1, right);
}