Pagini recente » Cod sursa (job #1978761) | Cod sursa (job #2182877) | Cod sursa (job #1279864) | Cod sursa (job #1899013) | Cod sursa (job #366368)
Cod sursa(job #366368)
#include <cstdio>
#define file_in "aib.in"
#define file_out "aib.out"
#define zeros(x) ((x^(x-1))&x)
#define Nmax 101838
int tip,a,b,Aib[Nmax*3],v[Nmax],n,m;
void add(int x, int val)
{
int i;
for (i=x;i<=n;i+=zeros(i))
Aib[i]+=val;
}
inline int query(int n)
{
int ret=0,i;
for (i=n;i>0;i-=zeros(i))
ret+=Aib[i];
return ret;
}
inline int bs(int val)
{
int step,i;
for (step=1;step<=n;step<<=1);
for (i=0;step;step>>=1)
if (i+step<=n && Aib[i+step]<=val)
{
i+=step;
val-=Aib[i];
if (val==0)
return i;
}
return -1;
}
int main()
{
int i;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d", &n, &m);
for (i=1;i<=n;++i)
{
scanf("%d", &v[i]);
add(i,v[i]);
}
while(m--)
{
scanf("%d", &tip);
if (tip==0)
{
scanf("%d %d", &a,&b);
add(a,b);
}
else
if (tip==1)
{
scanf("%d %d", &a,&b);
printf("%d\n", query(b)-query(a-1));
}
else
{
scanf("%d", &a);
printf("%d\n", bs(a));
}
}
fclose(stdin);
fclose(stdout);
return 0;
}