Pagini recente » Profil BanicaMatei | Cod sursa (job #2066156) | Cod sursa (job #2382670) | Cod sursa (job #673639) | Cod sursa (job #342919)
Cod sursa(job #342919)
#include <cstdio>
#define lm 100010
int v[lm], n, m;
void update(int p, int val)
{
do
{
v[p] += val;
p += (p&(p-1))^p;
//printf("%d\n",p);
}
while (p<=n);
}
int query(int p)
{
int s=0;
do
{
s += v[p];
p = p & (p-1);
}
while (p);
return s;
}
int search (int x)
{
int a, p=0, s=0;
for (a=1; a<=n; a<<= 1);
a >>= 1;
while (a)
{
if (s+v[p+a]<=x)
{
p += a;
s += v[p] ;
}
a >>= 1;
}
if (s!=x) p=-1;
return p;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n, &m);
int i, a, b, t;
for (i=1; i<=n; i++)
{
scanf("%d",&a);
update (i,a);
}
while (m--)
{
scanf("%d",&t);
if (t<2)
{
scanf("%d %d",&a, &b);
if (!t) update (a,b); else
{
b = query(b);
a = query(a-1);
printf("%d\n",b-a);
}
} else
{
scanf("%d",&a);
printf("%d\n", search (a));
}
}
}