Pagini recente » Cod sursa (job #546726) | Cod sursa (job #3285774) | Cod sursa (job #2820529) | Cod sursa (job #2604536) | Cod sursa (job #2439066)
#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;
}