Pagini recente » Cod sursa (job #1504181) | Cod sursa (job #1284044) | Cod sursa (job #2939680) | Cod sursa (job #690784) | Cod sursa (job #1183085)
#include <stdio.h>
#define ub(x) (x&(-x))
using namespace std;
FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");
long n,i,x,m,y,v[100001],a,b,t,sum,st,dr,mij;
void add(long x,long val)
{
int i;
for (i=x;i<=n;i+=ub(i))
v[i]+=val;
}
long suma(long x)
{
long s=0,i;
for (i=x;i>0;i-=ub(i))
s+=v[i];
return s;
}
int main()
{
fscanf(f,"%ld%ld",&n,&m);
for (i=1;i<=n;i++)
{
fscanf(f,"%ld",&x);
add(i,x);
}
for (i=1;i<=m;i++)
{
fscanf(f,"%ld",&t);
if (t==0 || t==1)
fscanf(f,"%ld%ld",&a,&b);
else
fscanf(f,"%ld",&a);
if (t==0)
add(a,b);
else if (t==1)
{
sum=suma(b)-suma(a-1);
fprintf(g,"%ld\n",sum);
}
else
{
st=1;
dr=n;
mij=(st+dr)/2;
while (st<dr && suma(mij)!=a)
{
if (suma(mij)<a)
st=mij+1;
else
dr=mij-1;
mij=(st+dr)/2;
}
while (suma(mij)==a)
mij--;
mij++;
if (suma(mij)==a)
fprintf (g,"%ld\n",mij);
else
fprintf (g,"-1\n");
}
}
fclose(f);
return 0;
}