Pagini recente » Cod sursa (job #3158091) | Cod sursa (job #644678) | Cod sursa (job #10356) | Cod sursa (job #2276145) | Cod sursa (job #607766)
Cod sursa(job #607766)
#include <stdio.h>
#define NMAX 100001
#define nz(x) (x & -x)
int v[NMAX], n, m;
void create()
{
for (int i = 1; i <= n; i++)
if (i + nz(i) <= n)
v[i + nz(i)] += v[i];
}
void update(int a, int b)
{
while (a <= n)
{
v[a] += b;
a += nz(a);
}
}
int suma(int x)
{
int s = 0;
while (x > 0)
{
s += v[x];
x -= nz(x);
}
return s;
}
int query(int a, int b)
{
return suma(b) - suma(a-1);
}
int pos(int s)
{
if (s == 0) return -1;
int k = 0, i;
while (s > 0)
{
i = 1;
while (k + i <= n && v[k + i] <= s) i <<= 1;
if (i == 1) return -1;
i >>= 1;
k += i;
s -= v[k];
}
return k;
}
int main()
{
int i, a, b, x;
FILE *fin, *fout;
fin = fopen("aib.in", "rt");
fout = fopen("aib.out", "wt");
fscanf(fin, "%d %d", &n, &m);
for (i = 1; i <= n; i++)
fscanf(fin, "%d", v+i);
create();
for (i = 1; i <= m; i++)
{
fscanf(fin, "%d", &x);
switch (x)
{
case 0:
fscanf(fin, "%d %d", &a, &b);
update(a, b);
break;
case 1:
fscanf(fin, "%d %d", &a, &b);
fprintf(fout, "%d\n", query(a, b));
break;
case 2:
fscanf(fin, "%d", &a);
fprintf(fout, "%d\n", pos(a));
break;
}
}
fclose(fin);
fclose(fout);
}