Pagini recente » Cod sursa (job #336277) | Cod sursa (job #3188033) | Cod sursa (job #3241398) | Cod sursa (job #2756811)
#include <cstdio>
#include <vector>
using namespace std;
class AIB{
public:
AIB(int size): size_(size + 1), data_(size + 1) {}
void add(int pos, int value) {
for (int i = pos; i < size_; i += i & (-i))
data_[i] += value;
}
int query(int pos) {
int answer = 0;
for (int i = pos; i > 0; i -= i & (-i))
answer += data_[i];
return answer;
}
int queryInterval(int left, int right) {
return query(right) - query(left - 1);
}
int smallest(int value) {
int li = 1, lf = size_ - 1;
while (li <= lf) {
int m = li + (lf - li) / 2;
int ans = query(m);
if (ans >= value)
lf = m - 1;
else
li = m + 1;
}
if (query(li) == value)
return li;
return -1;
}
private:
vector<int> data_;
int size_;
};
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int N, M;
scanf("%d%d", &N, &M);
AIB aib(N);
for (int i = 1; i <= N; ++i) {
int x;
scanf("%d", &x);
aib.add(i, x);
}
for (int i = 0; i < M; ++i) {
int op, a, b;
scanf("%d", &op);
if (op == 0) {
scanf("%d%d", &a, &b);
aib.add(a, b);
continue;
}
if (op == 1) {
scanf("%d%d", &a, &b);
printf("%d\n", aib.queryInterval(a, b));
continue;
}
scanf("%d", &b);
printf("%d\n", aib.smallest(b));
}
return 0;
}