Pagini recente » Cod sursa (job #686841) | Cod sursa (job #104258) | Monitorul de evaluare | Cod sursa (job #2077062) | Cod sursa (job #2762023)
#include <bits/stdc++.h>
#define Intro ios::sync_with_stdio(0), cin.tie(0)
#define ll long long
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int const N = 1e5 + 5;
int sums[N], tree[N], elements, queries;
void update(int pos, int value) {
while (pos <= elements) {
tree[pos] += value;
pos += pos & -pos; // here
}
}
int query(int right) {
int sum = 0;
while (right >= 1) {
sum += tree[right];
right -= right & -right; // here
}
return sum;
}
int find_pos(int target) {
int step;
for (step = 1; step < elements; step <<= 1);
for (int i = 0; step; step >>= 1) {
if (i + step > elements) {
continue;
}
int value = query(i + step);
if (target >= value) {
i += step;
if (target == value) {
return i;
}
}
}
return -1;
}
int main() {
Intro;
fin >> elements >> queries;
for (int i = 1; i <= elements; ++i) {
int value; fin >> value;
sums[i] = sums[i - 1] + value;
}
for (int i = 1; i <= elements; ++i) {
int largest_power = i & -i;
tree[i] = sums[i] - sums[i - largest_power];
}
for (int i = 1; i <= queries; ++i) {
int code; fin >> code;
if (code == 0) {
int pos, value;
fin >> pos >> value;
update(pos, value);
} else if (code == 1) {
int start, finish;
fin >> start >> finish;
fout << query(finish) - query(start - 1) << '\n';
} else {
int target; fin >> target;
fout << find_pos(target) << '\n';
}
}
//read the stuff below
return 0;
}
/* Plan
- read the statement carefully
- write stuff down (observations and ideas)
- consider the methods
- revise the solution before implementing it
- int overflow
- edge cases
- make the implementation clearly
*/