Pagini recente » Cod sursa (job #2307303) | Cod sursa (job #1624967) | Cod sursa (job #885545) | Cod sursa (job #1091799) | Cod sursa (job #3033259)
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
#define MAX_N 100000
const int sqrt_N = sqrt(MAX_N);
const int BATOG_SIZE = (MAX_N + sqrt_N - 1) / sqrt_N;
int v[MAX_N];
int batog[BATOG_SIZE];
void update(int poz, int val)
{
v[poz] = val;
int interval = poz / sqrt_N;
int pozB = interval * sqrt_N;
batog[interval] = 0;
for(int i = pozB; i < pozB + sqrt_N; ++i)
batog[interval] = max(batog[interval], v[i]);
}
int query(int st, int dr)
{
int firstBucket = (st + sqrt_N - 1) / sqrt_N * sqrt_N;
int lastBucket = dr / sqrt_N * sqrt_N;
int ans = 0;
while (st <= dr && st < firstBucket)
ans = max(v[st++], ans);
while (dr >= st && dr >= lastBucket)
ans = max(v[dr--], ans);
firstBucket /= sqrt_N;
lastBucket /= sqrt_N;
while(firstBucket < lastBucket)
{
ans = max(ans, batog[firstBucket++]);
}
return ans;
}
int main()
{
int n, m, c, a, b;
in >> n >> m;
for(int i = 1; i <= n; ++i)
{
in >> a;
update(i, a);
}
for(int i = 0; i < m; ++i)
{
in >> c >> a >> b;
if(c == 0)
{
out << query(a,b) << '\n';
} else
{
update(a,b);
}
}
return 0;
}