Cod sursa(job #2439322)

Utilizator ViAlexVisan Alexandru ViAlex Data 15 iulie 2019 17:30:13
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <iostream>
#include<fstream>
using namespace std;
#define MAX 100000

ifstream in("aib.in");
ofstream out("aib.out");

int n,m;
short values[MAX];

struct nod
{
    int a;
    int b;
    short value;
    nod*left=nullptr;
    nod*right=nullptr;
    nod(int min,int max)
    {
        a=min;
        b=max;
    }
};


nod*root;

int recurse_build_tree(nod*here)
{
    if(here->a==here->b)
    {
        here->value=values[here->a];
    }
    else
    {
        int middle=(here->a+here->b)/2;
        nod*left=new nod(here->a,middle);
        nod*right=new nod(middle+1,here->b);
        here->left=left;
        here->right=right;


        here->value=recurse_build_tree(left)+recurse_build_tree(right);

    }


    return here->value;

}

void build_tree()
{
    root=new nod(0,n-1);
    recurse_build_tree(root);

}


int find_sum(int l,int r,nod*here)
{
    int middle=(here->a+here->b)/2;
    if(here->a>=l && here->b<=r)
    {
        return here->value;
    }

    int to_return=0;

    if(l<=middle)
    {
        to_return+=find_sum(l,r,here->left);
    }
    if(r>middle)
    {
        to_return+=find_sum(l,r,here->right);
    }
    return to_return;




}

void add_value(int val,int index,nod*here)
{
    here->value+=val;

    if(here->a==here->b)
    {
        return;
    }
    else
    {
        int middle=(here->a+here->b)/2;
        if(index<=middle)
        {
            add_value(val,index,here->left);
        }
        else
        {
            add_value(val,index,here->right);
        }
    }
}

void add_value_to(int index,int val)
{
    add_value(val,index,root);
}
int get_sum_of_interval(int a,int b)
{
    return find_sum(a,b,root);

}


void read()
{
    in>>n>>m;
    for(int i=0; i<n; i++)
    {
        in>>values[i];
    }



}


int find_index(int value,int r)
{
    int middle=r/2;
    int sum_here=get_sum_of_interval(0,r);


}
void read_query()
{
    int aux,a,b;
    for(int i=0; i<m; i++)
    {
        in>>aux;
        if(aux==0)
        {
            in>>a>>b;
            add_value_to(a-1,b);
        }
        else if(aux==1)
        {
            in>>a>>b;
            out<<get_sum_of_interval(a-1,b-1)<<'\n';
        }
        else
        {

        }

    }



}

int main()
{
    read();
    build_tree();
    read_query();
    return 0;
}