Pagini recente » Cod sursa (job #1355225) | Cod sursa (job #2582687) | Cod sursa (job #3244767) | Cod sursa (job #410213) | Cod sursa (job #3164436)
#include <fstream>
#include <vector>
int tree[100005];
void add(int ind, int val, int n) {
for (int i = ind; i <= n; i += (i & -i))
tree[i] += val;
}
int query(int i) {
int sum = 0;
while (i > 0) {
sum += tree[i];
i -= (i & -i);
}
return sum;
}
int query2(int sum, int n) {
int left = 1, right = n, mid = (left + right)/2;
while (left <= right) {
int res = query(mid);
if (res == sum)
return mid;
if (res > sum)
right = mid - 1;
else
left = mid + 1;
mid = (left + right) / 2;
}
return -1;
}
int main() {
std::ifstream fin("aib.in");
std::ofstream fout("aib.out");
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
int temp;
fin >> temp;
add(i, temp, n);
}
for (int i = 0; i < m; i++) {
int op;
fin >> op;
switch (op) {
case 0:
int i, val;
fin >> i >> val;
add(i, val, n);
break;
case 1:
int a, b;
fin >> a >> b;
fout << query(b) - query(a-1) << '\n';
break;
case 2:
int sum;
fin >> sum;
fout << query2(sum, n) << '\n';
}
}
return 0;
}