Pagini recente » Cod sursa (job #1415377) | Cod sursa (job #2275908) | Cod sursa (job #1415390) | Cod sursa (job #2404601) | Cod sursa (job #2434016)
#include <iostream>
#include<fstream>
#define MAX 100000
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
struct node
{
int a,b;
node* n1=nullptr,*n2=nullptr;
int max_value;
node(int i1,int i2)
{
a=i1;
b=i2;
}
~node()
{
delete n1;
delete n2;
}
};
int numbers[MAX];
int numbers_count=0;
int query_count=0;
node*r;
int recurs_create(node*root)
{
if(root->a==root->b)
{
root->max_value=numbers[root->a];
}
else
{
int middle=(root->a+root->b)/2;
node*newnode1=new node(root->a,middle);
node*newnode2=new node(middle+1,root->b);
root->n1=newnode1;
root->n2=newnode2;
root->max_value=max(recurs_create(newnode1),recurs_create(newnode2));
}
return root->max_value;
}
int update_tree(node*root)
{
if(root->a==root->b)
{
root->max_value=numbers[root->a];
}
else
{
int middle=(root->a+root->b)/2;
root->max_value=max(update_tree(root->n1),update_tree(root->n2));
}
return root->max_value;
}
void generate_tree()
{
r=new node(0,numbers_count-1);
recurs_create(r);
}
void read()
{
in>>numbers_count>>query_count;
for(int i=0; i<numbers_count; i++)
{
in>>numbers[i];
}
}
int get_query(node*here,int desired1,int desired2,int a,int b)
{
if(a>=desired1 && b<=desired2)
{
return here->max_value;
}
else
{
int middle=(a+b)/2;
int res1=-1,res2=-1;
if(desired1<=middle)
{
res1=get_query(here->n1,desired1,desired2,a,middle);
}
if(desired2>middle)
{
res2=get_query(here->n2,desired1,desired2,middle+1,b);
}
return max(res1,res2);
}
}
int return_max_in(int a,int b)
{
return get_query(r,a,b,0,numbers_count-1);
}
int main()
{
read();
generate_tree();
int i,j,k;
for(int i=0; i<query_count; i++)
{
in>>i>>j>>k;
if(i==0)
{
out<<return_max_in(j-1,k-1)<<'\n';
}
else
{
numbers[j-1]=k;
update_tree(r);
}
}
return 0;
}