Pagini recente » Cod sursa (job #2335893) | Cod sursa (job #1941652) | Cod sursa (job #1533675) | Cod sursa (job #734790) | Cod sursa (job #1355517)
#include <cstdio>
#define ub(x) (x&(-x))
using namespace std;
int n,m,i,AIB[100010],op,x,a,b,pos,sol;
void add(int a,int b)
{
int i;
for(i=a; i<=n; i+=ub(i))
AIB[i]+=b;
return;
}
int sum(int x)
{
int i,s=0;
for(i=x; i>0; i-=ub(i))
s+=AIB[i];
return s;
}
int binary_search(int x)
{
int st=1,dr=n,Min=100001,m,s;
while(st<=dr)
{
m=st+(dr-st)/2;
s=sum(m);
if(s==x && Min>m)
Min=m;
else
{
if(s>=x)
dr=m-1;
else st=m+1;
}
}
if(Min==100001)
return -1;
else return Min;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(i=1; i<=n; ++i)
{
scanf("%d ",&x);
add(i,x);
}
scanf("\n");
for(i=1; i<=m; ++i)
{
scanf("%d ",&op);
if(op==0)
{
scanf("%d %d\n",&a,&b);
add(a,b);
}
if(op==1)
{
scanf("%d %d\n",&a,&b);
sol=sum(b)-sum(a-1);
printf("%d\n",sol);
}
if(op==2)
{
scanf("%d\n",&x);
pos=binary_search(x);
printf("%d\n",pos);
}
}
return 0;
}