#include <fstream>
#include <iostream>
#include <deque>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[100010];
struct node {
int value_left;
int value_right;
int value_vector;
node *left;
node *right;
};
node *make_tree(node *&head, int param_left, int param_right) {
head = new node;
if (param_left == param_right) {
node *aux = new node;
(*aux).value_left = param_left;
(*aux).value_right = param_right;
(*head).value_vector = v[param_left];
cout<<"The value of one leaf is equal with: "<<v[param_left]<<'\n';
(*head).left = nullptr;
(*head).right = nullptr;
head = aux;
return head;
}
(*head).left = make_tree((*head).left, param_left, param_left + (param_right - param_left) / 2);
(*head).right = make_tree((*head).right, param_left + (param_right - param_left) / 2 + 1, param_right);
(*head).value_left = param_left;
(*head).value_right = param_right;
//int VALL=0,VALR=0;
//if(((*head).left)==nullptr)
// VALL=(*head).value_vector;
//else
// VALL=((*(*head).left).value_vector);
// if(((*head).right)==nullptr)
// VALR=(*head).value_vector;
// else
// VALR=((*(*head).right).value_vector);
//(*head).value_vector = max(VALL,VALR);
(*head).value_vector=max(((*(*head).left).value_vector),(*(*head).right).value_vector);
cout<<"The value for head->left->value_vector is equal with "<<(*(*head).left).value_vector<<'\n';
cout<<"The value for head->right->value_vector is equal with"<<(*(*head).right).value_vector<<'\n'<<'\n';
// head->value_vector = max(head->left->value_vector, head->right->value_vector);
return head;
}
void display_tree(node *&head, int ¶m_left, int ¶m_right, int direction) {
if (direction == 1) {
head = (*head).left;
cout << (*head).value_left << " " << (*head).value_right << " " << (*head).value_vector << '\n';
return;
}
if (direction == 2) {
head = (*head).right;
cout << (*head).value_left << " " << (*head).value_right << " " << (*head).value_vector << '\n';
return;
} else {
cout << "Warning: You did not press 1 or 2\n";
return;
}
}
void modify_position(node *head,int position,int number)
{
if(((*head).value_left == position) && (*head).value_right==position)
{
(*head).value_vector=number;
v[position]=number;
return;
}
if(position <= ((*head).left)->value_right)
modify_position((*head).left,position,number);
(*head).value_vector = max(((*(*head).left).value_vector),((*head).right)->value_vector);
}
int check_position(node *head, int param_left, int param_right)
{
if(head->value_left == param_left && head->value_right== param_right)
return head->value_vector;
if(param_right<=head->left->value_right)
return check_position(head->left,param_left,param_right);
if(param_left>=head->right->value_left)
return check_position(head->right,param_left,param_right);
return max((check_position(head->left,param_left,head->left->value_right)), check_position(head->right,head->right->value_right,param_right));
}
node *TREE;
int main() {
int a,b,n,m,pos,nmb;
for (int i = 0; i <= 100000; i++)
v[i] = i;
cout << "Write the starting parameters you want to work with\n";
cin >> a >> b;
make_tree(TREE, a, b);
cout<<"Write how manny positions you want to modify\n";
cin>>m;
for(;m!=0;m--)
{
cout<<"Write the position you want to modify and the new value of the position\n";
cin>>pos>>nmb;
modify_position(TREE,pos,nmb);
}
cout << "Write how many instruction you want to write\n";
cin >> n;
for (; n != 0; n--) {
int instr;
cout << "write 1 for going left and 2 for going right\n";
cin >> instr;
display_tree(TREE, a, b, instr);
}
/*
int n,m;
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>v[i];
make_tree(TREE,0,n);
for(int i=1;i<=m;i++)
{
int op,a,b;
fin>>op>>a>>b;
if(op==0)
fout<<check_position(TREE,a,b)<<'\n';
else
modify_position(TREE,a,b);
}
return 0;
*/
return 0;
}