Pagini recente » Cod sursa (job #1885269) | Cod sursa (job #1106001) | Cod sursa (job #1522863) | Cod sursa (job #334995) | Cod sursa (job #2355203)
#include <fstream>
#include <iostream>
#include <cmath>
#define nmax 100005
#define mini -100005
using namespace std;
//ifstream fin("date.in");
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, ar[nmax], len, t[nmax * 4], q;
int maxim(int a, int b){
if(a > b) return a;
return b;
}
void read(){
fin >> n >> q;
if(log2(n) == (int)(log2(n)))
len = n * 2 - 1;
else
len = (int)(log2(n)) * 4 - 1;
for(int i = 0; i < n; ++i){
fin >> ar[i];
if(n <= len)
t[i] = mini;
}
}
void constructBT(int low, int high, int pos){
if(high == low){
t[pos] = ar[low];
return;
}
int middle = (high + low) / 2;
constructBT(low, middle, 2 * pos + 1);
constructBT(middle + 1, high, 2 * pos + 2);
t[pos] = maxim(t[2 * pos + 1], t[pos * 2 + 2]);
}
int rangeMaxQuery(int qlow, int qhigh, int low, int high, int pos){
if(qlow <= low && qhigh >= high)
return t[pos];
if(qlow > high || qhigh < low)
return mini;
int mid = (high + low) / 2;
return maxim(rangeMaxQuery(qlow, qhigh, low, mid, 2 * pos + 1), rangeMaxQuery(qlow, qhigh, mid + 1, high, 2 * pos + 2));
}
//void print(){
// for(int i = 0; i < len; ++i)
// cout << t[i] << " ";
// cout << '\n';
//}
int main(){
read();
constructBT(0, n - 1, 0);
int x, y, c;
for(int i = 0; i < q; ++i){
fin >> c >> x >> y;
if(c == 0)
fout << rangeMaxQuery(x - 1, y - 1, 0, n - 1, 0) << '\n';
else{
ar[x - 1] = y;
constructBT(0, n - 1, 0);
}
}
fin.close();
fout.close();
return 0;
}