Pagini recente » Istoria paginii utilizator/nikizan | Cod sursa (job #1330659) | Cod sursa (job #877543) | Cod sursa (job #1024468) | Cod sursa (job #695979)
Cod sursa(job #695979)
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m,maxi[400100],pos,val,maxim,sta,fin;
int max(const int &a,const int &b) {
return a>b ? a : b;
}
void update(int nod,int l,int r) {
if(l == r) {
maxi[nod] = val;
return;
}
int div=(l + r)/2;
if(pos <= div)
update(2*nod,l,div);
else
update(2*nod+1,div+1,r);
maxi[nod] = max(maxi[2*nod], maxi[2*nod+1]);
}
void query(int nod, int l, int r) {
if(sta <= l && r <= fin) {
if(maxim < maxi[nod]) maxim = maxi[nod];
return;
}
int div = (l + r)/2;
if(sta <= div)
query(2*nod,l,div);
if(div < fin)
query(2*nod+1,div+1,r);
}
int main() {
int i,x,a,b;
in >> n >> m;
for(i=1;i<=n;++i) {
in >> x;
pos=i; val=x;
update(1,1,n);
}
for(i=1;i<=m;++i) {
in >> x >> a >> b;
if(x==1) {
pos = a; val = b;
update(1,1,n);
}
else {
maxim=-1;
sta=a; fin=b;
query(1,1,n);
out << maxim << "\n";
}
}
return 0;
}