Pagini recente » Cod sursa (job #38030) | Cod sursa (job #815873) | Cod sursa (job #3284739) | Cod sursa (job #2777994) | Cod sursa (job #2432018)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
void update(vector<vector<int>> &arbint, int depth, int index, int value);
int query(vector<vector<int>> &arbint, int depth, int l1, int l2);
int main() {
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
fin>>n>>m;
vector<int> v(n);
for (int i = 0; i < n; i++) {
fin>>v[i];
}
vector<vector<int>> arbint;
arbint.push_back(v);
int depth;
for (int len = 2, i = 1; len <= n; len *=2, i++) {
int currLen = n / len + (n % len != 0);
arbint.push_back(vector<int>(currLen));
for (int j = 0; j < currLen; j++) arbint[i][j] = max(arbint[i-1][2 * j], arbint[i-1][2 * j + 1]);
depth = i;
}
for (int i = 0; i < m; i++) {
int q, a, b;
fin>>q>>a>>b;
//cout<<"req: "<<q<<' '<<a<<' '<<b<<'\n';
if (q) update(arbint, depth, a-1, b);
else fout<<query(arbint, depth, a-1, b-1)<<'\n';
}
}
void update(vector<vector<int>> &arbint, int depth, int index, int value) {
arbint[0][index] = value;
for (int i = 1; i <= depth; i++) {
index = index / 2;
arbint[i][index] = max(arbint[i-1][2 * index], arbint[i-1][2 * index + 1]);
}
}
int query(vector<vector<int>> &arbint, int depth, int l1, int l2) {
if (l2 < l1) return 0;
int len = 1, pow = 0;
//cout<<"initials: "<<l1<<' '<<l2<<'\n';
while (len < (l2 - l1 + 1) / 2) {
len *=2;
pow++;
}
//cout<<"query: "<<l1<<' '<<l2<<' '<<pow<<' '<<len<<'\n';
int lb = l2 / len * len, ub = lb + len - 1;
return max(arbint[pow][l2 / len], max(query(arbint, depth, l1, lb - 1), query(arbint, depth, ub + 1, l2)));
}