Pagini recente » Cod sursa (job #1231353) | Cod sursa (job #834433) | Cod sursa (job #543653) | Cod sursa (job #2912374) | Cod sursa (job #1472566)
#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];
//inline 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);
//}
//inline 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];
// }
//}
inline int getMax(int start, int end){
int maxim = 0;
for(; start%sqrtn != 0 && start <= end; ++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 = ed * sqrtn;
for(; ed <= end && ed >= start; ++ed)
if(A[ed] > maxim) maxim = A[ed];
return maxim;
}
//inline void update(int poz){
// 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];
//}
//inline void solve(){
// int c,a,b;
// for(register 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);
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);
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 c,a,b;
for(register 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;
int poz = a-1;
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];
}
}
return 0;
}