Pagini recente » Cod sursa (job #2949557) | Cod sursa (job #1554804) | Cod sursa (job #547092) | Cod sursa (job #1662568) | Cod sursa (job #1866570)
#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);
bool a=1;
for (int i=1;(long)i<=n && a;i<<=1)
if (aib[i]==x) printf("%d\n",i), a=0;
if (a==1)
printf("-1\n");
}
}
}