Cod sursa(job #2434033)

Utilizator ViAlexVisan Alexandru ViAlex Data 30 iunie 2019 13:59:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#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;
}