Pagini recente » Cod sursa (job #2282949) | Cod sursa (job #1384) | Cod sursa (job #144631) | Cod sursa (job #2030631) | Cod sursa (job #1568945)
#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;
int solution = 0;
int c = N + 1; int d = 0;
for(int i = 1; i <= N / p + 1; i ++)
{
if( a <= interval[i].left && interval[i].right <= b)
{
solution = max(solution, A[i]);
dr = max(dr, interval[i].right);
if(interval[i].left < st)
{
st = interval[i].left;
}
}
}
if(c == N + 1 && d == 0)
{
c = d = b;
}
for(int i = a; i <= c; i ++){
solution = max(solution, v[i]);
}
for(int i = d; i <= b; 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;
}