Pagini recente » Cod sursa (job #2527891) | Cod sursa (job #955842) | Cod sursa (job #524458) | Cod sursa (job #1478350) | Cod sursa (job #1232934)
/// Craciun Catalin
/// Arbori de intervale
/// Arhiva educationala
#include <iostream>
#include <fstream>
#define NMax 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m;
int positionToUpdate, valueToUpdate;
int MaxArb[4*NMax + 100];
int start, finish;
int maxim = -1;
inline int maxBetweenXY (int x, int y) { if (x > y) return x; return y; }
void Query (int nod, int st, int dr) {
if (start <= st && dr <= finish) {
if (maxim < MaxArb[nod]) maxim = MaxArb[nod];
return;
}
int mij = (st + dr)/2;
if (start <= mij) Query(2*nod, st, mij);
if (mij < finish) Query(2*nod+1, mij+1, dr);
}
void Update (int nod, int st, int dr) {
if (st == dr) {
MaxArb[nod] = valueToUpdate;
return;
}
int mij = (st+dr)/2;
if (positionToUpdate<=mij)
Update(2*nod, st, mij);
else
Update(2*nod+1, mij+1, dr);
MaxArb[nod] = maxBetweenXY (MaxArb[2*nod], MaxArb[2*nod+1]);
}
int main() {
f>>n>>m;
for (int i=1;i<=n;i++) {
int x;
f>>x;
positionToUpdate = i;
valueToUpdate = x;
Update(1,1,n);
}
for (int i=1;i<=m;i++) {
int type;
f>>type;
if (type == 0) {
int a, b;
f>>a>>b;
start = a;
finish = b;
maxim = -1;
Query(1, 1, n);
g<<maxim<<'\n';
} else if (type == 1) {
f>>positionToUpdate>>valueToUpdate;
Update(1,1,n);
}
}
f.close(); g.close();
return 0;
}