Pagini recente » Cod sursa (job #1221729) | Cod sursa (job #466910) | Cod sursa (job #895717) | Cod sursa (job #2342679) | Cod sursa (job #1046145)
#include <fstream>
#include <vector>
#include <cmath>
#define in "arbint.in"
#define out "arbint.out"
#define oo 1000000
std :: ifstream f(in);
std :: ofstream g(out);
int N, M;
std :: vector < int > Arb;
inline void Read_Data()
{
f >> N >> M;
//Arb.push_back(0);
for(int x, i = 1; i <= N; ++i)
{
f >> x;
Arb.push_back(x);
}
}
inline void Build_Tree()
{
N = (1 << (int(log2(N - 1)) + 1));
Arb.resize(2 * N, -1);
for(int i = N; i < 2 * N; ++i) Arb[i] = Arb[i - N];
for(int i = N - 1; i > 0; --i)
Arb[i] = std :: max(Arb[2 * i], Arb[2 * i + 1]);
}
inline int Rmq_Up(int st, int dr)
{
int ans = -1;
N = Arb.size() >> 1;
st += N - 1, dr += N - 1;
while(st <= dr)
{
if(st & 1) ans = std :: max(ans, Arb[st]);
if(!(dr & 1)) ans = std :: max(ans, Arb[dr]);
st = (st + 1) / 2, dr = (dr - 1) / 2;
}
return ans;
}
inline void Update(int poz, int elem)
{
N = Arb.size() / 2;
poz += N - 1;
Arb[poz] = elem;
while(poz >>= 1)
Arb[poz] = std :: max(Arb[2 * poz], Arb[2 * poz + 1]);
}
int main()
{
Read_Data();
Build_Tree();
for(int tip, x, y, i = 1; i <= M; ++i)
{
f >> tip >> x >> y;
if(!tip)
g << Rmq_Up(x, y) << '\n';
else
Update(x, y);
}
}