Pagini recente » Cod sursa (job #1368498) | Cod sursa (job #680750) | Cod sursa (job #607347) | Rating Pallai Hunor (nemtudom55) | Cod sursa (job #2522607)
#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 a, int b)
{
return query(b) - query(a - 1);
}
int smallest(int value)
{
int li = 1; int 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:
int size_;
vector<int> data_;
};
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int N, M;
scanf("%d%d", &N, &M);
AIB FenwickTree(N);
for (int i = 1; i <= N; ++i) {
int x;
scanf("%d", &x);
FenwickTree.add(i, x);
}
for (int i = 1; i <= M; ++i) {
int op;
scanf("%d", &op);
if (op == 0) {
int pos, val;
scanf("%d%d", &pos, &val);
FenwickTree.add(pos, val);
continue;
}
if (op == 1) {
int left, right;
scanf("%d%d", &left, &right);
printf("%d\n", FenwickTree.queryInterval(left, right));
continue;
}
int val;
scanf("%d", &val);
printf("%d\n", FenwickTree.smallest(val));
}
return 0;
}