Pagini recente » Cod sursa (job #2850133) | Cod sursa (job #658619) | Cod sursa (job #2980640) | Cod sursa (job #1632099) | Cod sursa (job #1507318)
#include <stdio.h>
#include <stdlib.h>
#define MX 100001
#define and &&
#define not !
FILE *in, *out;
int n, m, v[MX], i, j, a, b, s;
int zeros(int x)
{
return (-x) & x;
}
void update(int poz, int val)
{
for (int i = poz; i <= n; i += zeros(i)) v[i] += val;
}
int sum(int poz)
{
int s = 0;
for (; poz; poz -= zeros(poz)) s += v[poz];
return s;
}
int Search(int val)
{
int i, step;
for (step = 1; step < n; step <<= 1);
for (i = 0; step; step >>= 1)
{
if (i + step <= n)
{
if (val >= v[i + step])
{
i += step, val -= v[i];
if (!val) return i;
}
}
}
return -1;
}
int main()
{
in = fopen("aib.in", "r");
out = fopen("aib.out", "w");
fscanf(in, "%d %d\n", &n, &m);
for (int i = 1; i <= n; ++i)
{
fscanf(in, "%d", &a);
update(i, a);
}
for (i = 0; i < m; ++i)
{
fscanf(in, "%d", &a);
switch (a)
{
case 0:
{
fscanf(in, "%d %d", &a, &b);
update(a, b);
}
break;
case 1:
{
fscanf(in, "%d %d", &a, &b);
fprintf(out, "%d\n", sum(b) - sum(a - 1));
}
break;
case 2:
{
fscanf(in, "%d", &a);
fprintf(out, "%d\n", Search(a));
}
break;
}
}
fclose(in);
fclose(out);
return 0;
}