Pagini recente » Cod sursa (job #1665071) | Cod sursa (job #294804) | Cod sursa (job #859170) | Cod sursa (job #2021206) | Cod sursa (job #1568938)
#include <fstream>
#include <cmath>
#include <cstring>
#define left first
#define right second
#define BMAX 100010 * 5
#define DIM 100010
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int p, N, M, a, b, op, buffer, v[DIM], A[320], pozA[320];
char buf[BMAX];
pair<int, int> interval[320];
void gint(int &ans) {
ans = 0;
while (buf[buffer]<'0' || buf[buffer]>'9') {
buffer++;
if (buffer == BMAX - 1) {
fin.get(buf, BMAX, EOF);
buffer = 0;
}
}
while (buf[buffer] >= '0'&&buf[buffer] <= '9') {
ans = ans * 10 + buf[buffer++] - '0';
if (buffer == BMAX - 1) {
fin.get(buf, BMAX, EOF);
buffer = 0;
}
}
}
void update()
{
v[a] = b;
int i;
if(a / p == 1.0 * a / p)
{
i = a / p;
}
else
{
i = a / p + 1;
}
if(pozA[i] != a)
{
if(b < pozA[i])
{
return;
}
else
{
pozA[i] = b;
A[i] = b;
}
}
else
{
A[i] = 0;
for(int j = interval[i].left; j <= interval[i].right; j ++)
{
if(v[j] > A[i])
{
pozA[i] = j;
A[i] = v[j];
}
}
}
}
int query()
{
int st, dr;
if(a / p == 1.0 * a / p)
{
st = a / p + 1;
}
else
{
st = a / p + 2;
}
if(b / p == 1.0 * b / p)
{
dr = b / p + 1;
}
else
{
dr = b / p;
}
int solution = 0;
for(int i = st; i <= dr; i ++)
{
solution = max(solution, A[i]);
}
st --;
st *= p;
dr *= p;
for(int i = a; i <= st; i ++)
{
solution = max(solution, v[i]);
}
for(int i = b; i >= dr; i --)
{
solution = max(solution, v[i]);
}
return solution;
}
int main()
{
fin.get(buf, BMAX, EOF);
gint(N);
gint(M);
for(int i = 1; i <= N; i ++)
{
gint(v[i]);
}
p = (int)sqrt(N);
for(int i = 1; i * p <= N; i ++)
{
interval[i].left = (i - 1) * p + 1;
interval[i].right = i * p;
for(int j = interval[i].left; j <= interval[i].right; j ++)
{
if(v[j] > A[i])
{
pozA[i] = j;
A[i] = v[j];
}
}
}
while(M --)
{
gint(op);
if(op)
{
gint(a), gint(b);
update();
}
else
{
gint(a), gint(b);
fout << query() << '\n';
}
}
return 0;
}