Pagini recente » Cod sursa (job #3366384) | Cod sursa (job #3366824) | Cod sursa (job #3366826) | Cod sursa (job #3366825) | Cod sursa (job #3365507)
#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);
ft(n)
{
f >> v[i];
blocks[i / RADN] = max(v[i], blocks[i / RADN]);
}
}
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 + 1; 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] && v[pos] > val) //possible max loss
{
v[pos] = val;
for (int i = id * RADN; i < (id + 1) * RADN && i < n; i++)
blocks[id] = max(v[i], blocks[id]);
}
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);
}
}