Pagini recente » Cod sursa (job #1227417) | Cod sursa (job #1837471) | Cod sursa (job #1528855) | Cod sursa (job #2799961) | Cod sursa (job #764952)
Cod sursa(job #764952)
#include <stdio.h>
int BIT[100001], N, M;
FILE *in, *out;
void add(int index, int value);
int sum(int l, int r);
int findPos(int s);
int main()
{
int op, a, b;
in = fopen("aib.in", "r");
out = fopen("aib.out", "w");
fscanf(in, "%d %d", &N, &M);
for(a = 1; a <= N; a++)
fscanf(in, "%d", &b),
add(a, b);
for(; M; --M)
{
fscanf(in, "%d", &op);
switch(op)
{
case 0:
fscanf(in, "%d %d", &a, &b);
add(a, b);
break;
case 1:
fscanf(in, "%d %d", &a, &b);
fprintf(out, "%d\n", sum(a, b));
break;
default:
fscanf(in, "%d", &a);
fprintf(out, "%d\n", findPos(a));
}
}
fclose(in);
fclose(out);
return 0;
}
void add(int index, int value)
{
while(index <= N)
{
BIT[index] += value;
index += index ^ (index - 1) & index;
}
}
int sum(int l, int r)
{
int s1 = 0, s2 = 0, index;
index = l - 1;
while(index)
{
s1 += BIT[index];
index -= index ^ (index - 1) & index;
}
index = r;
while(index)
{
s2 += BIT[index];
index -= index ^ (index - 1) & index;
}
return s2 - s1;
}
int findPos(int s)
{
int index, i;
for(index = 1; index <= N; index <<= 1);
for(i = 0; index; index >>= 1)
if(i + index <= N && BIT[i + index] <= s)
{
i += index;
s -= BIT[i];
if(!s) return i;
}
return -1;
}