Pagini recente » Cod sursa (job #654170) | Cod sursa (job #1748305) | Cod sursa (job #1143490) | Cod sursa (job #2373128) | Cod sursa (job #790700)
Cod sursa(job #790700)
# include <cstdio>
using namespace std;
int val, n, m, i, op, a, b, aib[100005];
void update(int pos, int v)
{int k;
k = 0;
while (pos <= n)
{
aib[pos] += v;
while ( !(pos & 1<<k)) k++;
pos += 1<<k;
k++;
}
}
int query(int pos)
{int sum, k;
sum = 0; k = 0;
while (pos > 0)
{
sum += aib[pos];
while ( !(pos & 1<<k)) k++;
pos -= 1<<k;
k++;
}
return sum;
}
int cautbin(int s)
{int st, dr, mij, poz;
st = 0; dr = n + 1;
while (st <= dr)
{
mij = (st + dr) / 2;
if (query(mij) >= s) dr = mij - 1;
else st = mij + 1;
}
return query(st) == s ? st : -1;
}
int main()
{int poz;
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);
}
for (i = 1; i <= m; i++)
{
scanf("%d",&op);
if (op == 2) {
scanf("%d",&poz);
printf("%d\n",cautbin(poz));
}
else {
scanf("%d%d",&a,&b);
if (!op) update(a,b);
else if (op == 1) printf("%d\n",query(b) - query(a - 1));
}
}
return 0;
}