Pagini recente » Cod sursa (job #1244038) | Cod sursa (job #2037092) | Cod sursa (job #234047) | Cod sursa (job #1978090) | Cod sursa (job #1568966)
#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];
int solution;
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;
for(int i = 1; i * p <= N;i ++){
if( interval[i].left <= a && interval[i].right >= a )
{
A[i] = 0;
for(int j = interval[i].left; j <= interval[i].right; j ++){
A[i] = max(A[i],v[j]);
}
break;
}
}
}
void query()
{
int st, dr;
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]);
}
}
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);
solution = 0;
query();
fout << solution << '\n';
}
}
return 0;
}