Pagini recente » Cod sursa (job #782718) | Cod sursa (job #3305726) | Cod sursa (job #2204796) | Cod sursa (job #2204758) | Cod sursa (job #3305727)
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int Nmax = 100005;
const int SqrtNmax = 320;
int n, q, marime_bucket;
int elemente[Nmax], maxim_pe_bucket[SqrtNmax];
void citire_elemente(){
int nr_bucket;
fin >> n >> q;
marime_bucket = sqrt(n);
nr_bucket = -1;
for(int i = 0; i < n; i++){
if(i % marime_bucket == 0){
nr_bucket++;
}
fin >> elemente[i];
maxim_pe_bucket[nr_bucket] = max(maxim_pe_bucket[nr_bucket], elemente[i]);
}
}
void update(int pozitie, int valoare){
int indice = pozitie / marime_bucket;
elemente[pozitie] = valoare;
maxim_pe_bucket[indice] = 0;
int primul_element = indice * marime_bucket;
for(int i = 0; i < marime_bucket && primul_element + i < n; i++){
maxim_pe_bucket[indice] = max(maxim_pe_bucket[indice], elemente[primul_element + i]);
}
}
int query(int stanga, int dreapta){
int sol = 0, indice_stanga, indice_dreapta, capat_dr, capat_st;
indice_stanga = stanga / marime_bucket;
capat_dr = (indice_stanga + 1) * marime_bucket - 1;
indice_dreapta = dreapta / marime_bucket;
capat_st = indice_dreapta * marime_bucket;
if(indice_stanga == indice_dreapta){
for(int i = stanga; i <= dreapta; i++){
sol = max(sol, elemente[i]);
}
}
else{
for(int i = stanga; i <= capat_dr; i++){
sol = max(sol, elemente[i]);
}
for(int i = capat_st; i <= dreapta; i++){
sol = max(sol, elemente[i]);
}
for(int i = indice_stanga + 1; i < indice_dreapta; i++){
sol = max(sol, maxim_pe_bucket[i]);
}
}
return sol;
}
void citire_si_rezolvare_interogari(){
bool tip;
int stanga, dreapta, pozitie, valoare;
for(int i = 1; i <= q; i++){
fin >> tip;
if(tip){
fin >> pozitie >> valoare;
pozitie--;
update(pozitie, valoare);
}
else{
fin >> stanga >> dreapta;
stanga--; dreapta--;
fout << query(stanga, dreapta) << '\n';
}
}
}
int main(){
citire_elemente();
citire_si_rezolvare_interogari();
return 0;
}