Pagini recente » Cod sursa (job #1649706) | Cod sursa (job #1033146) | Cod sursa (job #155729) | Cod sursa (job #721326) | Cod sursa (job #1436238)
#include<cstdio>
int aib[100001];
int n;
int put2(int numar)
{
return numar xor (numar&(numar-1));
}
void adauga(int poz,int elem)
{
if(put2(poz)==0)
aib[poz]+=elem,poz++;
while(poz<=n)
{
aib[poz]+=elem;
poz+=(put2(poz));
}
}
// Suma(1,poz)
int suma(int poz)
{
int S=0;
while(poz>0)
{
S+=aib[poz];
poz-=(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);
int st=1,dr=n,mij;
bool pp=true;
while(st<dr && pp)
{
mij=(dr+st)/2;
if(s<suma(mij))
dr=mij;
else
if(s>suma(mij))
st=mij;
else
pp=false;
}
if(!pp)
printf("%d\n",mij);
else
printf("-1\n");
break;
};
}
}
fclose(stdin);
fclose(stdout);
return 0;
}