Pagini recente » Cod sursa (job #1151816) | Cod sursa (job #446355) | Cod sursa (job #2445709) | Istoria paginii utilizator/ucv_bota_lajea_nania | Cod sursa (job #680719)
Cod sursa(job #680719)
#include <cstdio>
int aib[100005] , N , M , logm;
int getpos(int s)
{
for(int i = 0 , stp = logm;stp;stp>>=1)
if(i + stp <= N && s >= aib[i + stp])
{
i+=stp , s-=aib[i];
if(!s) return i;
}
return -1;
}
int query(int i)
{
int s;
for(s = 0;i > 0;i-=(i & -i)) s+=aib[i];
return s;
}
void update(int i,int x)
{
for(;i <= N;i+=(i & -i))
aib[i]+=x;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&N,&M);
for(logm = 1;logm <= N;logm<<=1);
for(int i = 1 , val;i <= N;++i)
scanf("%d",&val), update(i,val);
for(int x , y , t;M;M--)
{
scanf("%d",&t);
if(t < 2) {
scanf("%d %d",&x,&y);
if(t == 1) printf("%d\n",query(y) - query(x - 1));
else
if(t == 0) update(x,y);
}
else
if(t == 2)
scanf("%d",&x) , printf("%d\n",getpos(x));
}
return 0;
}