Pagini recente » Cod sursa (job #990834) | Cod sursa (job #1976327) | Cod sursa (job #601411) | Cod sursa (job #645444) | Cod sursa (job #2288172)
//
// AIB.cpp
//
//
// Created by Raoul Bocancea on 22/11/2018.
//
#include <fstream>
const std :: string programName = "aib";
std :: ifstream f("aib.in");
std :: ofstream g("aib.out");
void Update(int, int);
int Query(int);
int intervalSum(int, int);
int QuerySearch(int, int);
const int NMAX = 1E5;
int N, M, AIB[NMAX + 5];
int main(void) {
f >> N >> M;
int pw2;
for (pw2 = 1; pw2 <= N; pw2 *= 2);
pw2 /= 2;
for (int i = 1; i <= N; ++i) {
int nr;
f >> nr;
Update(i, nr);
}
while (M--) {
int quest;
f >> quest;
if (quest == 0) {
int pos;
int val;
f >> pos >> val;
Update(pos, val);
} else if (quest == 1) { //AICI
int left, right;
f >> left >> right;
g << intervalSum(left, right) << '\n';
} else {
int value;
f >> value;
g << QuerySearch(pw2, value) << '\n';
}
}
return 0x0;
}
void Update(int pos, int val) {
for (int i = pos; i <= N; i += (i & -i))
AIB[i] += val;
}
int Query(int pos) {
int ans = 0;
for (int i = pos; i > 0; i -= (i & -i))
ans += AIB[i];
return ans;
}
int intervalSum(int left, int right) {
return Query(right) - Query(left - 1);
}
int QuerySearch(int pw2, int value) {
for (int pos = 0, step = pw2; step; step /= 2)
if ((pos + step) <= N and AIB[pos + step] <= value) {
pos += step;
value -= AIB[pos];
if (!value)
return pos;
}
return -1;
}