Pagini recente » Cod sursa (job #862283) | Cod sursa (job #2124645) | Cod sursa (job #3151698) | Cod sursa (job #128033) | Cod sursa (job #807799)
Cod sursa(job #807799)
#include<cstdio>
#define nmax 100005
using namespace std;
int n,m,v[nmax],aib[nmax];
void update(int poz,int val)
{
int i;
for(i=poz;i<=n;i+=(i&(-i)))
aib[i]+=val;
}
int query(int a,int b)
{
int i,s=0;
for(i=b;i;i-=(i&(-i)))
s+=aib[i];
for(i=a-1;i;i-=(i&(-i)))
s-=aib[i];
return s;
}
int search(int val)
{
int i,step=1<<n;
for(i=0;step;step>>=1)
if(i+step<=n)
if(val>=aib[i+step])
{
i+=step;
val-=aib[i];
if(!val)
return i;
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
int i,choice,a,b;
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<=n;i++)
update(i,v[i]);
while(m--)
{
scanf("%d",&choice);
switch(choice)
{
case 0:
{
scanf("%d %d",&a,&b);
update(a,b);
break;
}
case 1:
{
scanf("%d %d",&a,&b);
printf("%d\n",query(a,b));
break;
}
case 2:
{
scanf("%d",&a);
printf("%d\n",search(a));
break;
}
}
}
return 0;
}