Cod sursa(job #2434016)

Utilizator ViAlexVisan Alexandru ViAlex Data 30 iunie 2019 12:30:37
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 kb
#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;
}