Cod sursa(job #2765144)

Utilizator Teodor_AxinteAxinte Teodor-Ionut Teodor_Axinte Data 25 iulie 2021 14:20:42
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.27 kb
#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 &param_left, int &param_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;
}