Pagini recente » Cod sursa (job #1931161) | Cod sursa (job #2571789) | Cod sursa (job #3258103) | Cod sursa (job #1714713) | Cod sursa (job #491652)
Cod sursa(job #491652)
#include <cstdio>
#define lsb(x) (int) x&(-x)
int v[100003],n;
void add(int k,int val)
{
while (k<=n)
{
v[k]+=val;
k+=lsb(k);
}
}
int sum(int k)
{
int s=0;
while (k)
s+=v[k],k-=lsb(k);
return s;
}
int main()
{
int m,i,x,y,a;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=1;i<=n;++i)
{scanf("%d",&x);add(i,x);}
for (i=1;i<=m;++i)
{
scanf("%d",&x);
if (x==0)
{scanf("%d %d",&x,&y);add(x,y);}
else
if (x==1)
{scanf("%d%d",&x,&y);printf("%d\n",sum(y)-sum(x-1));} else
{
scanf("%d",&a);
x=1;y=n;int z=(x+y)/2,s=sum(z);
while (x<=y)
{
z=(x+y)/2,s=sum(z);
if (s>a) y=z-1; else
if (s<a) x=z+1; else
break;
}
if (s==a) printf("%d\n",z); else
printf("-1");
}
}
return 0;
}