Pagini recente » Cod sursa (job #49897) | Cod sursa (job #1640211) | Cod sursa (job #1452840) | Cod sursa (job #302414) | Cod sursa (job #1148052)
#include <cstdio>
using namespace std;
int a[100001],i,n,m,c,s,poz,x,y,val,caz;
void update(int poz, int val)
{
c=0;
while(poz<=n){
a[poz]+=val;
while(!(poz&(1<<c))){c++;}
poz+=1<<c;c++;
}
}
int query(int poz)
{
c=0;s=0;
while(poz){
s+=a[poz];
while(!(poz&(1<<c))){c++;}
poz-=1<<c;c++;
}
return s;
}
int search2(int val)
{
s=1;while(s<n){s<<=1;}
i=0;
while(s){
if(i+s<n){
if(val>=a[i+s]){
i+=s;val-=a[i];
if(!val){return i;}
}
}
s>>=1;
}
return -1;
}
int Search(int val)
{
int i, step;
for ( step = 1; step < n; step <<= 1 );
for( i = 0; step; step >>= 1 )
{
if( i + step <= n)
{
if( val >= a[i+step] )
{
i += step, val -= a[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&val);
update(i,val);
}
while(m--){
scanf("%d",&caz);
if(caz==0){
scanf("%d%d",&i,&val);
update(i,val);
}
if(caz==1){
scanf("%d%d",&x,&y);
printf("%d\n",query(y)-query(x-1));
}
if(caz==2){
scanf("%d",&val);
printf("%d\n",Search(val));
}
}
return 0;
}