Pagini recente » Cod sursa (job #2949421) | Cod sursa (job #1938012) | Cod sursa (job #2849237) | Cod sursa (job #2671571) | Cod sursa (job #2065956)
#include <bits/stdc++.h>
using namespace std;
int n, m, a[100100], sz, nr, block[1010], cod, x, y;
#define DIM 10000
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
numar = 0;
//cat timp caracterul din buffer nu e cifra ignor
while (buff[poz] < '0' || buff[poz] > '9')
//daca am "golit" bufferul atunci il umplu
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
//cat timp dau de o cifra recalculez numarul
while ('0'<=buff[poz] && buff[poz]<='9')
{
numar = numar*10 + buff[poz] - '0';
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
}
}
void build(){
int st = 1, dr = sz, rs;
while(dr <= n){
rs = 0;
for(int i = st; i <= dr; i++)
rs = max(rs, a[i]);
block[++nr] = rs;
st = dr + 1;
dr += sz;
}
}
int solve(int st, int dr){
int p = st, rs = 0, cur;
while(p % sz != 1 && p <= dr)
rs = max(a[p++], rs);
cur = p / sz + 1;
while(p + sz - 1 <= dr){
rs = max(block[cur], rs);
p += sz;
cur++;
}
while(p <= dr)
rs = max(a[p++], rs);
return rs;
}
void update(int x, int y){
a[x] = y;
int p = x / sz + ((x % sz) != 0);
int rs = 0, st = (p - 1) * sz + 1, dr = min(st + sz, n + 1);
for(int i = st; i < dr; i++)
rs = max(rs, a[i]);
block[p] = rs;
}
int main(){
freopen ( "arbint.in" , "r" , stdin);
freopen ( "arbint.out" , "w" , stdout);
citeste(n); citeste(m);
for(int i = 1; i <= n; i++)
citeste(a[i]);
sz = int(sqrt(n));
build();
for(int i = 1; i <= m; i++){
{ citeste(cod); citeste(x); citeste(y); }
if(cod)
update(x, y);
else
cout << solve(x, y) << '\n';
}
}