Pagini recente » Cod sursa (job #1310416) | Cod sursa (job #3178756) | Cod sursa (job #1322878) | Cod sursa (job #364624) | Cod sursa (job #590107)
Cod sursa(job #590107)
#include <fstream>
#define maxm(a, b) ((a > b) ? a : b)
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
struct s_node
{
int l,r;
int a,b;
int mij;
int max;
};
int n,m,nnode,maxk;
int t,x,y;
int a[100001];
s_node node[200001];
void new_node(int left, int right, int k);
void max(int k);
void interog(int left, int right, int k);
void update(int k);
int main()
{
int i1;
in>>n>>m;
for(i1=1;i1<n+1;i1++)
in>>a[i1];
//creerea arborelui
new_node(1,n,nnode+1);
//
//max 2n-1 noduri
for(i1=1;i1<nnode+1;i1++)
if(node[i1].a == node[i1].b)
node[i1].max = a[node[i1].a];
else
node[i1].max = -1;
max(1);
//
//cerinte
for(i1=0;i1<m;i1++)
{
in>>t>>x>>y;
if(!t) //interogare t == 0
{
maxk = -1;
interog(x,y,1);
out<<maxk<<'\n';
}
else // t == 1
{
update(1);
}
}
//
in.close();
out.close();
return 0;
}
void new_node(int left, int right, int k)
{
node[++nnode].a = left; node[nnode].b = right; node[nnode].mij = (left+right)/2;
if(left != right)
{
node[k].l = nnode + 1;
new_node(left, node[k].mij, nnode+1);
node[k].r = nnode + 1;
new_node(node[k].mij+1, right, nnode+1);
}
}
void max(int k)
{
if(node[node[k].l].max == -1)
max(node[k].l);
if(node[node[k].r].max == -1)
max(node[k].r);
node[k].max = maxm(node[node[k].l].max, node[node[k].r].max);
}
void interog(int left, int right, int k)
{
if(left == node[k].a && right == node[k].b)
maxk = maxm(maxk, node[k].max);
else
{
if(right <= node[k].mij)
interog(left,right,node[k].l);
else if(left > node[k].mij)
interog(left,right,node[k].r);
else
{
interog(left,node[k].mij,node[k].l);
interog(node[k].mij+1,right,node[k].r);
}
}
}
void update(int k)
{
if(node[k].l == node[k].r)
node[k].max = y;
else
{
if(x <= node[k].mij)
update(node[k].l);
else
update(node[k].r);
node[k].max = maxm(node[node[k].l].max, node[node[k].r].max);
}
}