Pagini recente » Cod sursa (job #1925849) | Cod sursa (job #1974945) | Formatare Textile | Cod sursa (job #2078724) | Cod sursa (job #583852)
Cod sursa(job #583852)
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define maxn 100033
int N, M, aib[maxn], v[maxn];
// adds val to position
void update(int pos, int val)
{
for (; pos <= N; pos += (pos & -pos))
{
aib[pos] += val;
}
}
int search(int val)
{
int i = 0, j = 0, step = 0;
for (step = 1; step < N; step <<= 1);
for (; step > 0; step >>= 1)
{
if (val >= aib[i+step])
{
i += step;
val -= aib[i];
if (!val)
return i;
}
}
return -1;
}
int sum(int pos)
{
int s = 0;
for (; pos>0; pos -= (pos & -pos))
{
s += aib[pos];
}
return s;
}
int main()
{
int i=0, a=0, b=0, op=0;
FILE *fin = fopen("aib.in", "rt"), *fout = fopen("aib.out", "wt");
fscanf(fin, "%d %d", &N, &M);
for (i=0; i<N; i++)
{
fscanf(fin, "%d", &v[i]);
update(i+1, v[i]);
}
for (i=0; i<M; i++)
{
fscanf(fin, "%d", &op);
if (op < 2)
{
fscanf(fin, "%d %d", &a, &b);
if (op == 0)
update(a, b);
else
{
fprintf(fout, "%d\n", sum(b) - sum(a-1));
}
}
else
{
fscanf(fin, "%d", &a);
fprintf(fout, "%d\n", search(a));
}
}
fclose(fin), fclose(fout);
return 0;
}