Pagini recente » Cod sursa (job #1342392) | Cod sursa (job #2808032) | Istoria paginii runda/concursceva2/clasament | Cod sursa (job #2009214) | Cod sursa (job #2439069)
#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;
}