Pagini recente » Cod sursa (job #870025) | Cod sursa (job #2088742) | Cod sursa (job #2114333) | Cod sursa (job #1212973) | Cod sursa (job #3004471)
#include <fstream>
#include <cmath>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int nmax = 100000;
int v[nmax + 1];
int tree[3*nmax + 2];
int n,lastnode;
void build_tree(int l = 1, int r = lastnode, int node = 1)
{
if(l == r && l <= n)
{
tree[node] = v[l];
return;
}
if(l == r && l > n)
{
tree[node] = 0;
return;
}
int med = (l + r) / 2;
build_tree(l, med, 2 * node);
build_tree(med + 1, r, 2 * node + 1);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
void update(int poza, int val, int l = 1, int r = lastnode, int node = 1)
{
if(l == r)
{
tree[node] = val;
return;
}
int med = (l + r) / 2;
if(poza <= med)
update(poza, val, l, med, 2 * node);
else
update(poza, val, med + 1, r, 2 * node + 1);
tree[node] = max(tree[2 * node], tree[2 * node + 1]);
}
int search_interval(int searchl, int searchr, int l = 1, int r = lastnode, int node = 1)
{
int maxi = -1;
if(searchl <= l && searchr >= r)
{
return tree[node];
}
int med = (l + r) / 2;
if(searchl <= med)
maxi = max(maxi, search_interval(searchl, searchr, l, med, 2 * node));
if(searchr > med)
maxi = max(maxi, search_interval(searchl, searchr, med + 1, r, 2 * node + 1));
return maxi;
}
int main()
{
int m;
in>>n>>m;
for(int i = 1; i <= n; i++)
in>>v[i];
int nrlevel = log2(n);
nrlevel += ((1<<nrlevel) < n);
lastnode = (1<<nrlevel);
build_tree();
for(int i = 1; i <= m; i++)
{
int q,a,b;
in>>q>>a>>b;
if(q == 0)
out<<search_interval(a,b)<<'\n';
if(q == 1)
update(a,b);
}
return 0;
}