Pagini recente » Cod sursa (job #2032601) | Cod sursa (job #3315871) | Cod sursa (job #3148178) | Cod sursa (job #501530) | Cod sursa (job #3330104)
#include <fstream>
#include <iostream>
using namespace std;
int aib[100001], n;
void Update(int pos, int val) {
for (; pos <= n; pos += (pos & -pos))
aib[pos] += val;
}
int Sum(int pos) {
int s = 0;
for (; pos > 0; pos -= (pos & - pos))
s += aib[pos];
return s;
}
int Query2(int val) {
int st = 1, dr = n, ans = -1;
while (st <= dr) {
int mij = (st + dr) / 2;
int x = Sum(mij);
if (x > val)
dr = mij - 1;
else if (x < val)
st = mij + 1;
else {
ans = mij;
dr = mij - 1;
}
}
return ans;
}
void Read() {
int q;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
fin >> n >> q;
for (int i = 1; i <= n; i++) {
int val;
fin >> val;
Update(i, val);
}
for (int i = 1; i <= q; i++) {
int x, y, op;
fin >> op >> x;
if (op < 2) {
fin >> y;
if (op == 0) Update(x, y);
else fout << Sum(y) - Sum(x - 1) << "\n";
}
else fout << Query2(x) << "\n";
}
}
int main() {
Read();
return 0;
}