Pagini recente » Cod sursa (job #2687206) | Cod sursa (job #1224648) | Cod sursa (job #889377) | Cod sursa (job #712478) | Cod sursa (job #2988728)
#include <fstream>
#include <cmath>
#include <set>
using namespace std;
const int Nmax = 100000;
const int Sq_n = sqrt(Nmax);
const int BatogSize = (Nmax + Sq_n - 1) / Sq_n;
int v[Nmax];
multiset<int> batog[BatogSize];
void update(int a, int b){
int nrinterval;
nrinterval = a / Sq_n;
batog[nrinterval].erase(batog[nrinterval].find(v[a]));
v[a] = b;
batog[nrinterval].insert(v[a]);
}
int query(int a, int b){
int firstinterval, lastinterval, result;
multiset<int>::iterator it;
firstinterval = (a + Sq_n - 1) / Sq_n * Sq_n;
lastinterval = b / Sq_n * Sq_n;
result = 0;
while(a <= b && a < firstinterval){
result = max(result, v[a]);
a++;
}
while(a <= b && lastinterval <= b){
result = max(result, v[b]);
b--;
}
firstinterval /= Sq_n;
lastinterval /= Sq_n;
while(firstinterval < lastinterval){
it = batog[firstinterval].end();
it--;
result = max(result, *it);
firstinterval++;
}
return result;
}
int main()
{
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, optype, a, b, nrinterval, cnt;
fin >> n >> m;
nrinterval = 0;
cnt = 0;
for(int i = 0; i < n; i++){
fin >> v[i];
batog[nrinterval].insert(v[i]);
cnt++;
if(cnt >= Sq_n){
cnt = 0;
nrinterval++;
}
}
for(int i = 0; i < m; i++){
fin >> optype >> a >> b;
if(optype == 0){
fout << query(a - 1, b - 1) << '\n';
}
else{
update(a - 1, b);
}
}
return 0;
}