Pagini recente » Cod sursa (job #608479) | Cod sursa (job #2808789) | Cod sursa (job #543593) | Cod sursa (job #1642459) | Cod sursa (job #2976230)
#include <cstdio>
#include <memory>
#include <vector>
using namespace std;
class FenwickTree{
private:
int treeSize;
int maxPow2;
vector<int> data;
public:
FenwickTree(int size) {
treeSize = size + 1;
data.resize(treeSize);
maxPow2 = 1;
while ((maxPow2 << 1) < treeSize)
maxPow2 <<= 1;
}
void add(int position, int value) {
for (int i = position; i < treeSize; i += (i&(-i)))
data[i] += value;
}
int query(int position) {
int val = 0;
for (int i = position; i > 0; i -= (i&(-i)))
val += data[i];
return val;
}
int queryInterval(int left, int right) {
return query(right) - query(left - 1);
}
int querySmallest(int value) {
int position = 0;
int crt = maxPow2;
while (crt) {
if (position + crt < treeSize && data[position + crt] <= value) {
value -= data[position + crt];
position += crt;
if (value == 0)
return position;
}
crt >>=1;
}
return -1;
}
void printFenwick() {
for (auto it: data)
printf("%d ", it);
printf("\n");
}
};
class Solver{
private:
public:
Solver() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
}
~Solver() {
fclose(stdin);
fclose(stdout);
}
void execute() {
int N, M;
scanf("%d%d", &N, &M);
int value;
FenwickTree fenwickTree(N);
for (int i = 1; i <= N; ++i) {
scanf("%d", &value);
fenwickTree.add(i, value);
}
int op, position, left, right;
for (int i = 1; i <= M; ++i) {
scanf("%d", &op);
if (op == 0) {
scanf("%d%d", &position, &value);
fenwickTree.add(position, value);
continue;
}
if (op == 1) {
scanf("%d%d", &left, &right);
printf("%d\n", fenwickTree.queryInterval(left, right));
continue;
}
//fenwickTree.printFenwick();
scanf("%d", &value);
printf("%d\n", fenwickTree.querySmallest(value));
}
}
};
int main() {
unique_ptr<Solver> s = make_unique<Solver>();
s->execute();
return 0;
}