Pagini recente » Cod sursa (job #2596526) | Cod sursa (job #2437653) | Cod sursa (job #1904392) | Cod sursa (job #2643836) | Cod sursa (job #2635030)
#include <stdio.h>
#include <vector>
#include <queue>
#define NMAX 100000
using namespace std;
FILE* fin, * fout;
int n, m, v[NMAX+1];
int aib[NMAX + 1] = { 0 };
void update(int index, int val) {
while (index <= n) {
aib[index] += val;
index += index & (-index);
}
}
int getSum(int i, int j) {
int s1 = 0, s2 = 0;
while (j > 0) {
s1 += aib[j];
j -= j & (-j);
}
--i;
while (i > 0) {
s2 += aib[i];
i -= i & (-i);
}
return s1 - s2;
}
int findK(int k) {
int i = 1, j = n;
while (i < j) {
int m = i + (j - i) / 2;
int s = getSum(1, m);
if (s == k && getSum(1, m - 1) != k)
return m;
if (s < k)
i = m + 1;
else
j = i - 1;
}
}
int main()
{
fin = fopen("aib.in", "r");
fout = fopen("aib.out", "w");
fscanf(fin, "%i %i", &n, &m);
for (int i = 1;i <= n;++i) {
fscanf(fin,"%i", &v[i]);
update(i, v[i]);
}
while (m--) {
int t;
fscanf(fin,"%i", &t);
if (t == 2) {
int k;
fscanf(fin, "%i", &k);
fprintf(fout,"%i\n", findK(k));
}
else {
int x, y;
fscanf(fin, "%i %i", &x, &y);
if (t == 0) {
update(x, y);
}
else {
fprintf(fout,"%i\n", getSum(x, y));
}
}
}
return 0;
}