Pagini recente » Monitorul de evaluare | Cod sursa (job #199239) | Cod sursa (job #3040263) | Istoria paginii preoni-2007/runda-3/11-12 | Cod sursa (job #1328940)
#include <fstream>
#include <cstring>
using namespace std;
class BinaryIndexedTree {
private:
int size, * tree;
inline int lsb(int x) {
return (x & (-x));
}
public:
BinaryIndexedTree(int Size) {
size = Size;
tree = new int[size + 1];
memset(tree, 0, sizeof(int) * (size + 1));
}
void update(int node, int value) {
for(; node <= size; node += lsb(node))
tree[node] += value;
}
int query(int node) {
int result = 0;
for(; node > 0; node -= lsb(node))
result += tree[node];
return result;
}
int sum(int a, int b) {
return (query(b) - query(a - 1));
}
int search(int sum) {
int i, step;
for(step = 1; step < size; step <<= 1);
for(i = 0; step; step >>= 1)
if(i + step <= size && tree[i + step] <= sum) {
i += step;
sum -= tree[i];
if(sum == 0)
return i;
}
return -1;
}
};
int main() {
int x, y, type, queries, N;
ifstream in("aib.in");
ofstream out("aib.out");
in >> N >> queries;
BinaryIndexedTree bit(N);
for(int i = 1; i <= N; i++) {
in >> x;
bit.update(i, x);
}
while(queries--) {
in >> type >> x;
switch(type) {
case 0:
in >> y;
bit.update(x, y);
break;
case 1:
in >> y;
out << bit.sum(x, y) << '\n';
break;
case 2:
out << bit.search(x) << '\n';
}
}
in.close();
out.close();
return 0;
}