Pagini recente » Cod sursa (job #1382092) | Cod sursa (job #1752671) | Cod sursa (job #1072583) | Cod sursa (job #698569) | Cod sursa (job #966040)
Cod sursa(job #966040)
#include<cstdio>
using namespace std;
int aib[136000], x;
void update(int poz, int val)
{
int p = poz;
while(p <= x)
{
aib[p] += val;
p = p +(p & (-p));
}
}
int query(int poz)
{
int p = poz, s = 0;
while(p > 0)
{
s += aib[p];
p = p - (p & (-p));
}
return s;
}
int cbaib(int val)
{
int st, dr, med, s, last = -1;
st = 1;
dr = x;
while(st <= dr)
{
med = (st + dr) >> 1;
s = query(med);
if(s < val)
st = med + 1;
else
{
dr = med - 1;
if(s == val)
last = med;
}
}
return last;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int n, m, op, a, b, val, i;
scanf("%d%d", &n, &m);
x = 1;
while(x < n)
{
x += x;
}
for(i = 1; i <= n; ++ i)
{
scanf("%d", &val);
update(i, val);
}
for(i = 1; i <= m; ++ i)
{
scanf("%d", &op);
if(op == 0)
{
scanf("%d%d", &a, &val);
update(a, val);
}
if(op == 1)
{
scanf("%d%d", &a, &b);
printf("%d\n", query(b) - query(a - 1));
}
if(op == 2)
{
scanf("%d", &val);
a = cbaib(val);
printf("%d\n", a);
}
}
return 0;
}