Pagini recente » Cod sursa (job #2337211) | Cod sursa (job #2045937) | Cod sursa (job #3220552) | Istoria paginii runda/jc2019-runda-1/clasament | Cod sursa (job #1472532)
#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);
FILE *out;
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 <= end; ++start)
if(A[start] > maxim) maxim = A[start];
int st = start/sqrtn;
int ed = end/sqrtn;
// printf("st = %d ed = %d\n", st, ed);
for(int i = st; i < ed; i++)
if(B[i] > maxim) maxim = B[i];
ed*= sqrtn;
for(; ed <= end && ed >= start; ++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) fprintf(out,"%d\n", getMax(a-1,b-1));
if(c == 1){
A[a-1] = b;
update(a-1);
// for(int i = 0; i < n; ++i)
// printf("%d ", A[i]);
// printf("\n");
// for(int i = 0; i < sn; ++i)
// printf("%d ", B[i]);
// printf("\n");
}
}
}
int main()
{
freopen(iname, "r", stdin);
// freopen(oname, "w",stdout);
out = fopen(oname, "w");
read();
initializeB();
solve();
return 0;
}