Pagini recente » Cod sursa (job #311358) | Cod sursa (job #2775260) | Cod sursa (job #749973) | Cod sursa (job #1168738) | Cod sursa (job #1866574)
#include <cstdio>
using namespace std;
int aib[100001],n;
int suma(int x)
{
int sum=0,x1=x,putere=1;
while (x)
{
sum+=aib[x];
x1=x;
putere=1;
while (x1%2==0)
putere<<=1, x1/=2;
x-=putere;
}
return sum;
}
void adauga(int x, int valoare)
{
int putere=1,x1=x;
while (x <= n)
{
aib[x]+=valoare;
x1=x;
putere=1;
while (x1%2==0)
putere<<=1, x1/=2;
x+=putere;
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int m;
scanf("%d %d\n",&n,&m);
for (int i=1;i<=n;i++)
{
int a;
scanf("%d ",&a);
adauga(i,a);
}
for (int j=1;j<=m;j++)
{
int a,x,y;
scanf("%d ",&a);
if (a==0)
{
scanf("%d %d\n",&x,&y);
adauga(x,y);
}
if (a==1)
{
scanf("%d %d\n",&x,&y);
printf("%d\n",suma(y)-suma(x-1));
}
if (a==2)
{
scanf("%d\n",&x);
int pas=1,i=1;
for (pas=1;(long)pas<=n;pas<<=1);
for (i=0;pas;pas>>=1)
{
if (i+pas<=n && suma(i+pas)<x)
i+=pas;
}
if (suma(i+1)==x)
printf("%d\n",i+1);
else
printf("-1\n");
}
}
}