Pagini recente » Cod sursa (job #2263723) | Cod sursa (job #1820673) | Cod sursa (job #3139434) | Cod sursa (job #685665) | Cod sursa (job #2814348)
// Teo, e cod vechi dar m-ai rugat sa fac iterativ :)
#include <bits/stdc++.h>
using namespace std;
const int NMAX=1e5;
const int INFINIT=1e9+7;
const int LEN=(1<<18);
const int LENBUF = (1 << 17);
int v[LEN/2], tree[LEN], maxx;
int lstart, rstart;
FILE *fin, *fout;
char buff[LENBUF], rbf = 0;
char readCh() {
if(rbf == 0)
fread(buff, 1, LENBUF, fin);
char retval = buff[rbf];
rbf = (rbf + 1) % LENBUF;
return retval;
}
int readInt() {
char ch;
int n;
while(!isdigit(ch = readCh()));
n = 0;
do {
n = n * 10 + ch - '0';
}while(isdigit(ch = readCh()));
return n;
}
void build(int n){
for(int i=0; i<n; i++)
tree[i+n-1]=v[i];
for(int i=n-2; i>=0; i--)
tree[i]=max(tree[2*i+1], tree[2*i+2]);
}
void update(int poz, int val, int n){
tree[poz+n-1]=val;
int i=poz+n-1;
while(i>0){
if(i%2==1)
tree[(i-1)/2]=max(tree[i], tree[i+1]);
else
tree[(i-1)/2]=max(tree[i], tree[i-1]);
i=(i-1)/2;
}
}
void maximum(int i, int l, int r){ /// node i has interval [l, r]
if(rstart<l || lstart>r) return;
else if(l>=lstart && r<=rstart){
maxx=max(maxx, tree[i]);
return;
}else{
int mid=(l+r)/2;
maximum(2*i+1, l, mid);
maximum(2*i+2, mid+1, r);
}
}
int main(){
int n, m, op, l, r;
//cout<<(1<<18);
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
n = readInt();
m = readInt();
for(int i=0; i<n; i++) v[i] = readInt();
int nn=1;
while(nn<=n) nn<<=1;
//cout<<nn<<endl;
for(int i=n; i<nn; i++) v[i]=-INFINIT;
build(nn);
for(int i=0; i<m; i++){
//int op, l, r;
op = readInt();
l = readInt();
r = readInt();
if(op==1){
update(l-1, r, nn);
//for(int i=0; i<2*nn-1; i++) cout<<tree[i]<<' ';
}else{
maxx=-INFINIT;
lstart=l-1;
rstart=r-1;
maximum(0, 0, nn-1);
fprintf(fout, "%d\n", maxx);
}
}
//for(int i=0; i<2*nn-1; i++) cout<<tree[i]<<' ';
return 0;
}