Pagini recente » Cod sursa (job #1102398) | Cod sursa (job #534817) | Monitorul de evaluare | Cod sursa (job #3128259) | Cod sursa (job #252549)
Cod sursa(job #252549)
#include <cstdio>
const int MAX_N = 100010;
int n, m;
int aib[MAX_N];
void update(int poz, int val)
{
while (poz <= n)
{
aib[poz] += val;
poz += poz & -poz;
}
}
int query(int poz)
{
int sum = 0;
while (poz)
{
sum += aib[poz];
poz &= poz - 1;
}
return sum;
}
int find(int x)
{
int pow = 1, i;
while ((pow << 1) <= n) pow <<= 1;
for (i = 0; pow; pow >>= 1)
if (i + pow <= n && aib[i + pow] <= x)
{
x -= aib[i + pow];
i += pow;
}
if (!x) return i;
return -1;
}
int main()
{
int i, x, y, z;
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
for (i = 1; i <= n; ++i)
{
scanf("%d", &x);
aib[i] += x;
if (i + (i & -i) <= n)
aib[i + (i & -i)] += aib[i];
}
for (i = 1; i <= m; ++i)
{
scanf("%d %d", &x, &y);
if (x == 0)
{
scanf("%d", &z);
update(y, z);
}
if (x == 1)
{
scanf("%d", &z);
printf("%d\n", query(z) - query(y - 1));
}
if (x == 2)
printf("%d\n", find(y));
}
}