Pagini recente » Cod sursa (job #2312632) | Cod sursa (job #2791219) | Cod sursa (job #2613127) | Cod sursa (job #614657) | Cod sursa (job #3230183)
#include <vector>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define VI vector<int>
int N, M;
VI AIB;
void update(int idx, int val) {
for (int i = idx; i <= N; i += i & -i) {
AIB[i] += val;
}
}
int query(int idx) {
int sum = 0;
for (int i = idx; i > 0; i -= i & -i) {
sum += AIB[i];
}
return sum;
}
int sum(int a, int b) {
return query(b) - query(a - 1);
}
int binSearch(int val) {
int lft = 1, rgt = N, mid, pos = -1;
while(lft <= rgt) {
mid = (lft + rgt) / 2;
if (query(mid) >= val) {
pos = mid;
rgt = mid - 1;
} else {
lft = mid + 1;
}
}
if (query(pos) != val) {
return -1;
}
return pos;
}
int main() {
fin >> N >> M;
AIB = VI(N + 1, 0);
for (int i = 1; i <= N; ++i) {
int val;
fin >> val;
update(i, val);
}
for (int i = 1; i <= M; ++i) {
int opp;
fin >> opp;
if (opp == 0) {
int idx, val;
fin >> idx >> val;
update(idx, val);
}
else if (opp == 1) {
int a, b;
fin >> a >> b;
fout << sum(a, b) << '\n';
} else {
int val;
fin >> val;
fout << binSearch(val) << '\n';
}
}
}