Pagini recente » Cod sursa (job #3365508) | Cod sursa (job #3365282) | Cod sursa (job #3365358) | Cod sursa (job #3365301) | Cod sursa (job #3365394)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vc;
#define ft(n) for(ull i=1; i<=n; i++)
#define sp ' '
string file = "arbint";
ifstream f(file + ".in");
ofstream g(file + ".out");
const int RADN = 317;
int n, m, q, a, b;
vc v;
vc blocks(320, 0);
void init()
{
f >> n >> m;
v.resize(n + 5, 0);
int block_max = 0;
ft(n)
{
f >> v[i];
block_max = max(v[i], block_max);
if (i % RADN == 0)
blocks[i / RADN] = block_max;
}
if (blocks[n / RADN] == 0)
blocks[n / RADN] = block_max;
}
int query(int a, int b)
{
int maxq = 0;
int lblock = a / RADN;
int rblock = b / RADN;
//g << n << sp << a << sp << b << sp << lblock * RADN << sp << rblock * RADN << endl;
if (lblock == rblock)
{
for (int i = a; i <= b; i++)
maxq = max(v[i], maxq);
}
else
{
for (int i = a; i < (lblock + 1) * RADN; i++)
maxq = max(v[i], maxq);
for (int i = lblock; i < rblock; i++)
maxq = max(blocks[i], maxq);
for (int i = rblock * RADN; i <= b; i++)
maxq = max(v[i], maxq);
}
return maxq;
}
void update(int pos, int val)
{
int id = pos / RADN;
if (v[pos] == blocks[id]) //possible max loss
{
v[pos] = val;
int block_max = 0;
for (int i = id * RADN; i < (id + 1) * RADN && i < n; i++)
block_max = max(v[i], block_max);
blocks[id] = block_max;
}
else
{
v[pos] = val;
blocks[id] = max(val, blocks[id]);
}
}
int main()
{
init();
ft(m)
{
f >> q >> a >> b;
if (q == 0) g << query(a, b) << "\n";
else if (q == 1) update(a, b);
}
}