Pagini recente » Cod sursa (job #127207) | Cod sursa (job #3221931) | Cod sursa (job #1433960) | Cod sursa (job #1575142) | Cod sursa (job #2784158)
#include <fstream>
#define NMAX 100000
#define MAXLOG 16
using namespace std;
ifstream cin ("aib.in");
ofstream cout ("aib.out");
int n;
int vaib[NMAX + 3];
static inline int lsb(int val) { /// least significant bit
return val & (-val);
}
void update(int val, int poz) {
while (poz <= n) {
vaib[poz] += val;
poz += lsb(poz);
}
}
int query1(int poz) { /// suma dintre (1, n)
int sol = 0;
while (poz > 0) {
sol += vaib[poz];
poz -= lsb(poz);
}
return sol;
}
int query2(int val) {
int i, sum, pozcur;
sum = pozcur = 0;
for (i = MAXLOG; i >= 0; i--) {
if ((1 << i) + pozcur <= n && sum + vaib[pozcur + (1 << i)] <= val) {
sum += vaib[pozcur + (1 << i)];
pozcur += (1 << i);
}
if (sum == val)
return pozcur;
}
return -1;
}
int main() {
int t, x, a, b, i, op;
cin >> n >> t;
for (i = 1; i <= n; i++) {
cin >> x;
update(x, i);
}
while (t--) {
cin >> op;
if (op == 0) {
cin >> a >> b;
update(b, a);
}
else if (op == 1) {
cin >> a >> b;
cout << query1(b) - query1(a - 1) << "\n";
}
else {
cin >> a;
cout << query2(a) << "\n";
}
}
return 0;
}