Pagini recente » Cod sursa (job #2605163) | Cod sursa (job #2960204) | Cod sursa (job #1401334) | Cod sursa (job #1961236) | Cod sursa (job #937939)
Cod sursa(job #937939)
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
const char iname[] = "arbint.in";
const char oname[] = "arbint.out";
ifstream fin(iname);
ofstream fout(oname);
int N, M, a, b, cod_op, bucket_max, i, j, rad, ind_dr, ind_st, last_dr, nrg = 1;
struct bucket{
int val, g_ind;
}v[100004];
struct up2date{
int mv;
int st, dr;
}G[10004];
inline void update (int poz, int x){
v[poz].val = x;
bucket_max = 0;
i = v[poz].g_ind;
for (j = G[i].st; j <= G[i].dr; ++j)
bucket_max = max(bucket_max, v[j].val);
G[i].mv = bucket_max;
}
inline int query (int x, int y)
{
int Q_ANS = 0;
int mxv = 0;
ind_st = v[x].g_ind; ind_dr = v[y].g_ind;
for (i = y; i >= G[ind_dr].st; --i)
mxv = max(mxv, v[i].val);
for (i = x; i <= G[ind_st].dr; ++i)
mxv = max(mxv, v[i].val);
Q_ANS = max(Q_ANS, mxv);
ind_st += 1; ind_dr -= 1;
for (i = ind_st; i <= ind_dr; ++i)
Q_ANS = max(Q_ANS, G[i].mv);
return Q_ANS;
}
int main()
{
fin >> N >> M; rad = sqrt(1.0 * N);
for (i = 1, j = 1; i <= N; ++i, ++j)
{
fin >> v[i].val; v[i].g_ind = nrg;
bucket_max = max(bucket_max, v[i].val);
if (j == rad)
{
G[nrg].mv = bucket_max;
G[nrg].dr = i; last_dr = i;
G[nrg].st = i - rad + 1;
bucket_max = 0, j = 0, ++nrg;
}
}
G[nrg].st = last_dr; G[nrg].dr = N;
for (i = last_dr + 1; i <= N; ++i)
bucket_max = max(bucket_max, v[i].val);
G[nrg].mv = bucket_max;
while (M--)
{
fin >> cod_op;
if (cod_op){
fin >> a >> b;
update(a, b);
}
else{
fin >> a >> b;
fout << query(a, b) << '\n';
}
}
return 0;
}