Pagini recente » Cod sursa (job #49071) | Cod sursa (job #528791) | Cod sursa (job #1072007) | Cod sursa (job #1098522) | Cod sursa (job #3352272)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
long long m, n, s;
vector <long long> a;
vector <long long> b;
int op0(int st, int dr)
{
int maxim_gasit = -1;
int bloc_start = (st - 1) / s;
int bloc_final = (dr - 1) / s;
if(bloc_start == bloc_final)
{
for(int i = st; i <= dr; i++)
{
if (a[i] > maxim_gasit)
maxim_gasit = a[i];
}
}
else
{
int limita_bloc = (bloc_start + 1) * s;
for(int i = st; i <= limita_bloc; i++)
{
if (a[i] > maxim_gasit)
maxim_gasit = a[i];
}
for (int i = bloc_start + 1; i < bloc_final; i++)
{
if(b[i] > maxim_gasit)
maxim_gasit = b[i];
}
int inceput_bloc_final = bloc_final * s + 1;
for (int i = inceput_bloc_final; i <= dr; i++)
{
if (a[i] > maxim_gasit) maxim_gasit = a[i];
}
}
return maxim_gasit;
}
void actualizeaza(int poz, int valoare) {
a[poz] = valoare;
int id = (poz - 1) / s;
int inceput = id * s + 1;
int sfarsit = min((id + 1) * s, n);
b[id] = -1;
for (int i = inceput; i <= sfarsit; i++) {
if (a[i] > b[id]) b[id] = a[i];
}
}
int main()
{
fin >> m >> n;
int op, st, dr;
s = sqrt(n);
int nr_blocuri = (n + s - 1)/s;
b.assign(nr_blocuri, -1);
a.resize(n+1);
for(int i = 1; i <= n; i++)
{
fin >> a[i];
int id_bloc = (i - 1) / s;
if(a[i] > b[id_bloc])
b[id_bloc] = a[i];
}
for(int i = 0; i < m; i++)
{
fin >> op >> st >> dr;
if(op == 0)
{
fout << op0(st, dr) << "\n";
}
else
actualizeaza(st, dr);
}
return 0;
}