Pagini recente » Cod sursa (job #3244096) | Cod sursa (job #487417) | Cod sursa (job #2412620) | Cod sursa (job #164823) | Cod sursa (job #2115146)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
//ifstream f("arbint.in");
ofstream g("arbint.out");
const int MaxN = 100005;
const int BUF_SIZE = 1 << 17;
int v[MaxN], n, m, maxi[400], bsize, nrb;
int pos = BUF_SIZE, out = 0;
char buf[BUF_SIZE], Out[BUF_SIZE], str[10];
FILE *f = fopen("arbint.in", "r");
inline char nextch(){
if(pos==BUF_SIZE) fread(buf, BUF_SIZE, 1, f), pos=0;
return buf[pos++];
}
inline int read(){
int x=0;
char ch=nextch();
while(!isdigit(ch)) ch=nextch();
while(isdigit(ch)){
x=10*x+ch-'0';
ch=nextch();
}
return x;
}
inline void update(int poz, int val) {
v[poz] = val;
int bucket = (poz - 1) / bsize + 1;
if (bucket <= nrb) {
if (maxi[bucket] <= v[poz]) maxi[bucket] = v[poz];
else {
maxi[bucket] = 0;
for (int j = 1; j <= bsize; ++j) maxi[bucket] = max(maxi[bucket], v[(bucket - 1) * bsize + j]);
}
}
}
inline int query(int l, int r) {
int ans = 0;
if (r - l + 1 < bsize) {
for (int i = l; i <= r; ++i) ans = max(ans, v[i]);
return ans;
}
int bucket = (l - 2) / bsize + 1;
while (l <= r && l <= bucket * bsize) {
ans = max(ans, v[l]);
++l;
}
if (l == r) return max(ans, v[l]);
bucket = r / bsize;
while (r >= l && r > bucket * bsize) {
ans = max(ans, v[r]);
--r;
}
while (l <= r) {
ans = max(ans, maxi[(l - 1) / bsize + 1]);
l += bsize;
}
return ans;
}
int main()
{
n = read(); m = read();
for (int i = 1; i <= n; ++i) v[i] = read();
bsize = sqrt(n) + 2;
for (int i = 1; bsize * i <= n; ++i)
for (int j = 1; j <= bsize; ++j) {
maxi[i] = max(maxi[i], v[bsize * (i - 1) + j]);
nrb = i;
}
for (int i = 1; i <= m; ++i) {
int c = read(), a = read(), b = read();
if (c == 0) g << query(a, b) << '\n';
else update(a, b);
}
return 0;
}