Pagini recente » Cod sursa (job #66394) | Cod sursa (job #314998) | Cod sursa (job #440499) | Cod sursa (job #645498) | Cod sursa (job #832286)
Cod sursa(job #832286)
#include <fstream>
using namespace std;
const char IN[] = "arbint.in";
const char OUT[] = "arbint.out";
ifstream fin(IN);
ofstream fout(OUT);
const int KMAX = 225000;
int A[KMAX];
int N, M;
int u, v, qmax, val, pos;
inline int maxim(int p, int q)
{
if(p > q)
return p;
return q;
}
inline int isLeft(int nod)
{
if((nod << 1) <= KMAX)
return 1;
return 0;
}
inline int isRight(int nod)
{
if((nod << 1) + 1 <= KMAX)
return 1;
return 0;
}
void Update(int nod, int left, int right)
{
if(left == right)
A[nod] = val;
else
{
int m = (left + right) >> 1;
if(pos <= m && isLeft(nod))
Update(nod << 1, left, m);
if(pos > m && isRight(nod))
Update((nod << 1) + 1, m + 1, right);
if(isLeft(nod))
A[nod] = A[nod << 1];
if(isRight(nod))
A[nod] = maxim(A[nod], A[(nod << 1) + 1]);
}
}
void Query(int nod, int left, int right)
{
if(u <= left && right <= v)
if(qmax < A[nod])
qmax = A[nod];
else;
else
{
int m = (left + right) >> 1;
if(u <= m && isLeft(nod))
Query(nod << 1, left, m);
if(m < v && isRight(nod))
Query((nod << 1) + 1, m + 1, right);
}
}
int main()
{
int i, c;
fin >> N >> M;
for(i = 1; i <= N; ++i)
{
fin >> val;
pos = i;
Update(1, 1, N);
}
for(i = 1; i <= M; ++i)
{
fin >> c >> u >> v;
if(!c)
{
qmax = -1;
Query(1, 1, N);
fout << qmax << '\n';
}
else
{
pos = u;
val = v;
Update(1, 1, N);
}
}
return 0;
}