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