Pagini recente » Cod sursa (job #1710880) | Autentificare | Cod sursa (job #582785) | tgesgt | Cod sursa (job #739818)
Cod sursa(job #739818)
#include<cstdio>
#define dim 100001
int arb[dim],c,s,n,m;
void update(int poz,int val)
{
c=0;
while( poz<=n )
{
arb[poz]+=val;
while( !(poz & (1<<c)) )c++;
poz += (1<<c);
c += 1;
}
}
int query(int poz){
c=s=0;
while( poz>0 )
{
s+=arb[poz];
while( !(poz & (1<<c)) )c++;
poz -= (1<<c);
c++;
}
return s;
}
int search(int sum)
{
int left=1,right=n,mid;
while(right-left>1)
{
mid=(right+left)>>1;
if(query(mid)<sum)left=mid;
else right=mid;
}
if(query(left)==sum)return left;
if(query(right)==sum)return right;
return -1;
}
int main(void){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int i,x,a,b;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i){
scanf("%d",&x);
update(i,x);
}
for(i=1;i<=m;++i)
{
scanf("%d",&x);
if( x<2 )
{
scanf("%d%d",&a,&b);
if(!x) update(a,b);
else printf("%d\n",query(b)-query(a-1));
}
else
{
scanf("%d",&a);
printf("%d\n",search(a));
}
}
return 0;
}