Pagini recente » Cod sursa (job #2924582) | Cod sursa (job #734870) | Cod sursa (job #2145310) | Cod sursa (job #2615132) | Cod sursa (job #1114500)
#include<stdio.h>
using namespace std;
FILE *in,*out;
//constante
const int Nmax=(int) 1e5+1;
//functii
void update(int position,int value);
int query(int position);
int search(int value);
//variabile
int elemente,intrebari;
int val,pos;
int tree[Nmax];
int tip;
int left,right;
int main(void)
{
in=fopen("aib.in","rt");
out=fopen("aib.out","wt");
fscanf(in,"%d%d",&elemente,&intrebari);
for(int i=1 ; i<=elemente ; ++i)
{
fscanf(in, "%d",&val);
update(i,val);
}
while(intrebari--)
{
fscanf(in, "%d", &tip);
if(tip)
{
if(tip==1)
{
fscanf(in, "%d%d", &left,&right);
fprintf(out,"%d\n",query(right)-query(left-1));
}
else
{
fscanf(in,"%d",&val);
fprintf(out,"%d\n",search(val));
}
}
else
{
fscanf(in, "%d%d", &pos,&val);
update(pos,val);
}
}
fclose(in);
fclose(out);
return 0;
}
void update(int position,int value)
{
int power=0;
while(position<=elemente)
{
tree[position]+=value;
while(!(1<<power & position))
power++;
position+=(1<<power);
}
}
int query(int position)
{
int sum=0;
int power=0;
while(position)
{
sum+=tree[position];
while(!(1<<power & position))
power++;
position-=(1<<power);
}
return sum;
}
int search(int value)
{
int left=1;
int right=elemente;
while(left<=right)
{
int mid=(left+right)/2;
int sum=query(mid);
if(value==sum)
return mid;
else
if(value<sum)
right=mid-1;
else
left=mid+1;
}
return -1;
}