Pagini recente » Cod sursa (job #1892588) | Cod sursa (job #13510) | Cod sursa (job #2755391) | Cod sursa (job #322978) | Cod sursa (job #1434422)
#include<cstdio>
int aib[100001];
int n;
int put2(int numar)
{
int put=0;
while(numar%2==0)
{
numar/=2;
put++;
}
return put;
}
void adauga(int poz,int elem)
{
if(put2(poz)==0)
aib[poz]+=elem,poz++;
while(poz<=n)
{
aib[poz]+=elem;
poz+=(1<<put2(poz));
}
}
// Suma(1,poz)
int suma(int poz)
{
int S=0;
while(poz>0)
{
S+=aib[poz];
poz-=(1<<put2(poz));
}
return S;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
int elem;
scanf("%d ",&elem);
adauga(i,elem);
}
for(int j=1;j<=m;j++)
{
int tip;
scanf("%d ",&tip);
switch(tip)
{
case 0:{
int poz,val;
scanf("%d %d ",&poz,&val);
adauga(poz,val);
break;
};
case 1:{
int st,dr;
scanf("%d %d ",&st,&dr);
printf("%d\n",suma(dr)-suma(st-1));
break;
};
case 2:{
int s;
scanf("%d ",&s);
bool pp=true;
for(int i=0;(1<<i)<=n && pp;i++)
{
if(aib[1<<i]==s)
{
printf("%d\n",(1<<i));
pp=0;
}
}
if(pp)
printf("-1\n");
break;
};
}
}
fclose(stdin);
fclose(stdout);
return 0;
}