Pagini recente » Cod sursa (job #2852249) | Cod sursa (job #1297147) | Cod sursa (job #73169) | Cod sursa (job #120844) | Cod sursa (job #3337733)
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long
#define INF 1000000000
#define MOD 666013
const int NMAX = 100005;
int v[NMAX], AIB[NMAX], n;
void Update (int pos, int val) {
for (int i = pos; i <= n; i += (i & (-i))) AIB[i] += val;
return;
}
int Query1 (int pos) {
int val = 0;
for (int i = pos; i > 0; i -= (i & (-i))) val += AIB[i];
return val;
}
int Query2 (int val) {
int i = 0, sum = 0;
for (int k = (1 << 17); k >= 1; (k = k >> 1)) {
if (i + k <= n && AIB[i + k] + sum <= val) {
i += k;
sum += AIB[i];
}
}
return i;
}
int main() {
ifstream fin("aib.in");
ofstream fout("aib.out");
int q;
fin >> n >> q;
for (int i = 1; i <= n; i++) {
fin >> v[i];
Update(i, v[i]);
}
while (q--) {
int type;
fin >> type;
if (type == 0) {
int a, b;
fin >> a >> b;
Update(a, b);
}
else if (type == 1) {
int a, b;
fin >> a >> b;
fout << Query1(b) - Query1(a - 1) << '\n';
}
else {
int x;
fin >> x;
int ans = Query2(x);
if (Query1(ans) == x) fout << ans << '\n';
else fout << -1 << '\n';
}
}
return 0;
}