Pagini recente » Cod sursa (job #1222833) | Cod sursa (job #2081344) | Cod sursa (job #546483) | Cod sursa (job #274360) | Cod sursa (job #1472517)
#include <cstdio>
#include <cmath>
using namespace std;
const char iname[] = "arbint.in";
const char oname[] = "arbint.out";
const int MAXN = 100005;
const int SMAXN = sqrt(MAXN);
int A[MAXN],n,m,sqrtn, sn;
int B[SMAXN];
void read(){
scanf("%d %d\n", &n, &m);
sqrtn = sqrt(n);
if(sqrt(n) * sqrt(n) == n)
sn = sqrtn + 1;
else
sn = sqrt(n) + 1;
for(int i = 0; i < n; ++i)
scanf("%d", A+i);
}
void initializeB(){
for(int index = 0; index < sn; ++index){
int start = index * sqrtn;
int end = (index + 1) * sqrtn;
for(int i = start; i < end && i < n; ++i)
if(A[i] > B[index]) B[index] = A[i];
}
}
int getMax(int start, int end){
int maxim = 0;
for(; start%sqrtn != 0; ++start)
if(A[start] > maxim) maxim = A[start];
int st = start/sqrtn;
int ed = end/sqrtn;
for(int i = st; i < ed; i++)
if(B[i] > maxim) maxim = B[i];
ed*= sqrtn;
for(; ed <= end; ++ed)
if(A[ed] > maxim) maxim = A[ed];
return maxim;
}
void update(int poz){
poz /= sqrtn;
B[poz] = 0;
int start = sqrtn * poz;
int end = sqrtn * (poz + 1);
for(int i = start; i < end && i < n; ++i)
if(A[i] > B[poz]) B[poz] = A[i];
}
void solve(){
int c,a,b;
for(int i = 0; i < m; ++i){
scanf("%d %d %d", &c, &a, &b);
if(c == 0) printf("%d\n", getMax(a-1,b-1));
if(c == 1){
A[a-1] = b;
update(a-1);
}
}
}
int main()
{
freopen(iname, "r", stdin);
freopen(oname, "w",stdout);
read();
initializeB();
solve();
return 0;
}