Pagini recente » Cod sursa (job #1261289) | Cod sursa (job #2418547) | Cod sursa (job #123576) | Cod sursa (job #2116449) | Cod sursa (job #1786724)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int nMax = 100005;
int v[nMax], bucata[400];
int n, m;
int lungime;
void Construire()
{
lungime = sqrt(n);
for(int i = 0; i < n; i ++)
{
int index = i / lungime;
bucata[index] = max(bucata[index], v[i]);
}
}
int Query(int st, int dr)
{
int pasi = dr % lungime + 1;
int sol = 0;
/// calculam maximul din bucata ramasa in dreapta
for(int i = 0; i < pasi && st >= dr; i ++)
{
sol = max(sol, v[dr]);
dr --;
}
/// calculam maximul din bucata ramasa in stanga
pasi = lungime - (st % lungime);
for(int i = 0; i < pasi && st <= dr; i ++)
{
sol = max(sol, v[st]);
st ++;
}
int start = (st / lungime);
int stop = (dr / lungime);
for(int i = start; i <= stop; i ++)
sol = max(sol, bucata[i]);
return sol;
}
void Update(int poz, int val)
{
int index = poz / lungime;
bucata[index] = 0;
int start = poz - (poz % lungime);
int stop = min(n, start + lungime - 1);
v[poz] = val;
for(int i = start; i <= stop; i ++)
bucata[index] = max(bucata[index], v[i]);
}
int main()
{
in >> n >> m;
for(int i = 0; i < n; i ++)
in >> v[i];
Construire();
for(int i = 1; i <= m; i ++)
{
bool op;
in >> op;
if(op == 0)
{
int st, dr;
in >> st >> dr;
st --, dr --;
int sol = Query(st, dr);
out << sol << "\n";
}
else
{
int poz, valoare;
in >> poz >> valoare;
poz --;
Update(poz, valoare);
}
}
return 0;
}