Pagini recente » Cod sursa (job #1887398) | Cod sursa (job #626258) | Cod sursa (job #3349038) | Cod sursa (job #3304537) | Cod sursa (job #470332)
Cod sursa(job #470332)
#include <fstream.h>
#define nmax 100005
int N, Sum[nmax];
inline int digits2(int k) {
return (k & (k - 1)) ^ k;
}
void add(int i, int v) {
for (int k = i; k <= N; k += digits2(k)) {
Sum[k] += v;
}
}
int sum(int i, int j) {
int sum = 0;
for (int k = j; k >= 1; k -= digits2(k)) {
sum += Sum[k];
}
for (int k = i - 1; k >= 1; k -= digits2(k)) {
sum -= Sum[k];
}
return sum;
}
int find(int v) {
for (int l = 1, r = N; l <= r;) {
int m = (l + r) >> 1;
int s = sum(1, m);
if (s < v) {
l = m + 1;
} else if (s > v) {
r = m - 1;
} else {
return m;
}
}
return -1;
}
int main() {
ifstream fin("aib.in");
ofstream fout("aib.out");
int a, b, n, m;
fin >> N >> m;
for (int n = 1; n <= N; ++n) {
fin >> a;
add(n, a);
}
while (m--) {
fin >> b;
switch (b) {
case 0:
fin >> a >> b;
add(a, b);
break;
case 1:
fin >> a >> b;
fout << sum(a, b) << '\n';
break;
case 2:
fin >> a;
fout << find(a) << '\n';
break;
}
}
fin.close();
fout.close();
return 0;
}