Cod sursa(job #2439066)

Utilizator ViAlexVisan Alexandru ViAlex Data 14 iulie 2019 20:12:04
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.77 kb
#include <iostream>
#include<fstream>
using namespace std;
#define MAX 100000

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

int n,m;
int values[MAX];
int sums[MAX];

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


nod*root;

int bin_search(int*h,int value,int l,int r)
{
    if(l>=r)
    {
        if(h[l]==value)
            return l;
        return -1;
    }
    int mid=(l+r)/2;
    int mid_val=h[mid];
    if(value<=mid_val)
    {
        return bin_search(h,value,l,mid);
    }
    else
        return bin_search(h,value,mid+1,r);


}




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);
    for(int i=index; i<n; i++)
    {
        sums[i]+=val;
    }
}
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];
        sums[i]+=values[i];
        if(i)
        {
            sums[i]+=sums[i-1];
        }
    }



}

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
        {
            in>>a;
            int result=bin_search(sums,a,0,n);
            if(result!=-1)
                result++;
            out<<result<<'\n';

        }

    }



}

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