Pagini recente » Cod sursa (job #2921227) | Cod sursa (job #1661213) | Cod sursa (job #2291033) | Cod sursa (job #3000970) | Cod sursa (job #2784157)
#include <fstream>
#define NMAX 100000
#define MAXLOG 16
#define int long long
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 && sum < val; 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;
}
signed 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;
}