Pagini recente » Cod sursa (job #2649809) | Cod sursa (job #925302) | Cod sursa (job #809507) | Cod sursa (job #1627078) | Cod sursa (job #1162992)
#include <cstdio>
#define nmax 100010
using namespace std;
int n,m,aib[nmax];
int doik(int x)
{
return (x^(x-1))&x;
}
void citire()
{
int i,x,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
for(j=i;j<=n;j+=(doik(j)))
aib[j]+=x;
}
}
int sum(int x)
{
int i,s=0;
for(i=x;i>0;i-=doik(i))
s+=aib[i];
return s;
}
int caut(int x)
{
int i=1,k;
while(i<n)
i*=2;
for(k=0;i>0;i/=2)
if(k+i<=n && x>=aib[k+i])
{
k+=i;
x-=aib[k];
if(!x)
return k;
}
return -1;
}
void rez()
{
int i,j,op,a,b;
for(i=1;i<=m;i++)
{
scanf("%d",&op);
if(op==2)
scanf("%d",&a);
else scanf("%d%d",&a,&b);
if(op==0)
{
for(j=a;j<=n;j+=doik(j))
aib[j]+=b;
}
else if(op==1)
printf("%d\n",sum(b)-sum(a-1));
else printf("%d\n",caut(a));
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
citire();
rez();
return 0;
}