Pagini recente » Cod sursa (job #2564554) | Cod sursa (job #2221794) | Cod sursa (job #1568836) | Cod sursa (job #2785176) | Cod sursa (job #779660)
Cod sursa(job #779660)
#include <stdio.h>
#define zeros(x) (x&(x-1)^x)
#define NMax 100010
const char IN[]="aib.in",OUT[]="aib.out";
int N,M;
int arb[NMax];
void update(int x,int val){
for (; x<=N ; x+=zeros(x))
arb[x]+=val;
}
int query(int x){
int ret=0;
for (; x>0 ; x-=zeros(x))
ret+=arb[x];
return ret;
}
int search(int val){
int step,i;
for (step=1;step<=N;step<<=1);
for (i=0;step;step>>=1)
if (i+step<=N && val>=arb[i+step]){
i+=step;val-=arb[i];
if (!val) return i;
}
return -1;
}
int main()
{
int i,c,x,a,b;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&M);
for (i=1;i<=N;++i)
scanf("%d",&x),
update(i,x);
freopen(OUT,"w",stdout);
while (M--)
{
scanf("%d",&c);
if (c==0) scanf("%d%d",&a,&b),update(a,b);
else if (c==1) scanf("%d%d",&a,&b),printf("%d\n",query(b)-query(a-1));
else scanf("%d",&a),printf("%d\n",search(a));
}
fclose(stdout);
fclose(stdin);
return 0;
}