Pagini recente » Cod sursa (job #1188312) | Cod sursa (job #673924) | Cod sursa (job #1941206) | Cod sursa (job #2069233) | Cod sursa (job #3149257)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int NMAX = 1e6;
int v[NMAX + 5], n, rmax;
vector <int> aint;
void build(int node = 1, int left = 1, int right = rmax)
{
if(left == right and left > n)
{
aint[node] = 0;
return;
}
if(left == right)
{
aint[node] = v[left];
return;
}
int mid = (left + right) / 2;
build(2 * node, left, mid);
build(2 * node + 1, mid + 1, right);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
void update(int pos, int value, int node = 1, int left = 1, int right = rmax)
{
if(left == right and left > n)
{
aint[node] = 0;
return;
}
if(left == right)
{
aint[node] = value;
return;
}
int mid = (left + right) / 2;
if(pos <= mid)
update(pos, value, 2 * node, left, mid);
if(mid < pos)
update(pos, value, 2 * node + 1, mid + 1, right);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
int query(int qleft, int qright, int node = 1, int left = 1, int right = rmax)
{
if(qleft <= left and right <= qright)
return aint[node];
int mid = (left + right) / 2;
int leftans = 0, rightans = 0;
if(qleft <= mid)
leftans = query(qleft, qright, 2 * node, left, mid);
if(mid < qright)
rightans = query(qleft, qright, 2 * node + 1, mid + 1, right);
return max(leftans, rightans);
}
int main()
{
int m;
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> v[i];
int nodes, exp = log2(n);
if((1 << exp) != n)
exp++;
nodes = 2 * (1 << exp) - 1;
rmax = 1 << exp;
aint.resize(nodes + 5);
build();
for(int i = 1; i <= m; i++)
{
int op;
fin >> op;
if(op == 0)
{
int qleft, qright;
fin >> qleft >> qright;
fout << query(qleft, qright) << '\n';
}
if(op == 1)
{
int pos, value;
fin >> pos >> value;
update(pos, value);
}
}
fin.close();
fout.close();
return 0;
}