Pagini recente » Cod sursa (job #454242) | Cod sursa (job #2597737) | Cod sursa (job #454855) | Cod sursa (job #1167838) | Cod sursa (job #2434033)
#include <iostream>
#include<fstream>
#define MAX 100000
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int values[MAX];
int number_count;
int query_count;
struct node
{
node*n1=nullptr,*n2=nullptr;
int max_value;
int limit1,limit2;
node(int a,int b)
{
limit1=a;
limit2=b;
}
};
node*root;
int add_nodes(node*r)
{
if(r->limit1==r->limit2)
{
r->max_value=values[r->limit1];
}
else
{
int middle=(r->limit1+r->limit2)/2;
r->n1=new node(r->limit1,middle);
r->n2=new node(middle+1,r->limit2);
r->max_value=max(add_nodes(r->n1),add_nodes(r->n2));
}
return r->max_value;
}
int get_max(node*r,int a,int b,int limit1,int limit2)
{
if(limit1<=a && b<=limit2)
{
return r->max_value;
}
else
{
int middle=(a+b)/2;
int r1=-1,r2=-1;
if(limit1<=middle)
{
r1=get_max(r->n1,a,middle,limit1,limit2);
}
if(limit2>middle)
{
r2=get_max(r->n2,middle+1,b,limit1,limit2);
}
return max(r1,r2);
}
}
void set_value(node*r,int index,int value)
{
if(r->limit1==r->limit2)
{
r->max_value=value;
return;
}
else
{
int middle=(r->limit1+r->limit2)/2;
if(index<=middle)
{
set_value(r->n1,index,value);
}
else
{
set_value(r->n2,index,value);
}
r->max_value=max(r->n1->max_value,r->n2->max_value);
}
}
void set_value_at(int index,int value)
{
set_value(root,index,value);
}
int get_max_in_interval(int limit1,int limit2)
{
return get_max(root,0,number_count-1,limit1,limit2);
}
void create_tree()
{
root=new node(0,number_count-1);
add_nodes(root);
}
void read()
{
in>>number_count>>query_count;
for(int i=0; i<number_count; i++)
{
in>>values[i];
}
}
void solve()
{
int a,b,c;
for(int i=0; i<query_count; i++)
{
in>>a>>b>>c;
if(a==0)
{
out<<get_max_in_interval(b-1,c-1)<<'\n';
}
else
{
set_value_at(b-1,c);
}
}
}
int main()
{
read();
create_tree();
solve();
return 0;
}