Pagini recente » Cod sursa (job #3030786) | Cod sursa (job #455074) | Cod sursa (job #2801849) | Cod sursa (job #1343359) | Cod sursa (job #1228698)
#include <iostream>
#include <fstream>
using namespace std;
typedef struct element {
int value, st, dr;
} ELEMENT;
#define nmax 2*100001+1
ifstream fi("arbint.in");
ofstream fo("arbint.out");
int N, M;
int A[nmax];
ELEMENT H[nmax];
int lenH, i;
int tip, val, poz, st, dr;
void initialize()
{
lenH = 1;
while (lenH < N)
lenH <<= 1;
for (i = lenH; i <= 2 * lenH - 1; i++)
{
H[i].value = A[i - lenH + 1];
H[i].st = H[i].dr = i - lenH + 1;
}
for (i = 2 * lenH - 1; i > 1; i--)
{
if (H[i>>1].value < H[i].value)
H[i>>1].value = H[i].value;
H[i>>1].st = H[i].st;
H[i>>1].dr = H[i+1].dr;
}
}
void update(int val, int poz)
{
poz = poz + lenH - 1;
H[poz].value = val;
while ((poz>>1) > 0)
{
poz >>= 1;
H[poz].value = max(H[poz<<1].value, H[(poz<<1)+1].value);
}
}
int query(int nod, int st, int dr)
{
if (H[nod].st > dr)
return 0;
if (H[nod].dr < st)
return 0;
if (st <= H[nod].st && H[nod].dr <= dr)
return H[nod].value;
int stP = query(nod*2, st, dr);
int drP = query(nod*2+1, st, dr);
return max(stP, drP);
}
void citire()
{
fi >> N >> M;
for (i = 1; i <= N; i++)
fi >> A[i];
initialize();
for (i = 1; i <= M; i++)
{
fi >> tip;
if (tip == 0)
{
fi >> st >> dr;
fo << query(1, st, dr) << "\n";
}
else
{
fi >> poz >> val;
update(val, poz);
}
}
}
int main()
{
citire();
fi.close();
fo.close();
return 0;
}