Pagini recente » Cod sursa (job #1834961) | Cod sursa (job #1950098) | Cod sursa (job #1909217) | Cod sursa (job #929005) | Cod sursa (job #1232953)
// Craciun Catalin
// Arbori de intervale
#include <iostream>
#include <fstream>
#define NMax 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,MaxArb[4*NMax+100];
int valueToUpdate, positionToUpdate;
int maxim;
int start, finish;
inline int maxBetweenXY (int x, int y) {if (x>y)return x; return y;};
void Query(int nod, int left, int right) {
if (start <= left && right <= right) {
if (maxim < MaxArb[nod])
maxim = MaxArb[nod];
return;
}
int mij = (left+right)/2;
if (start <= mij) Query(2*nod, left, mij);
if (mij < finish) Query(2*nod+1, mij+1, right);
}
void Update(int nod, int left, int right) {
if (left == right) {
MaxArb[nod] = valueToUpdate;
return;
}
int mij = (left+right)/2;
if (positionToUpdate <= mij)
Update(2*nod, left, mij);
else
Update(2*nod+1, mij+1, right);
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;
}