Pagini recente » Cod sursa (job #880672) | Cod sursa (job #1770445) | Cod sursa (job #2134522) | Cod sursa (job #187174) | Cod sursa (job #3334328)
#include <bits/stdc++.h>
using namespace std;
constexpr int nmax = 1e5 + 5;
int n, m;
int aib[nmax];
void update(int pos, int val) {
if (pos > n)
return;
aib[pos] += val;
update(pos + (pos & -pos), val);
}
int query(int pos, int sum = 0) {
if (pos > n)
return query(n);
if (pos <= 0)
return sum;
return query(pos - (pos & -pos), sum + aib[pos]);
}
int query_int(int a, int b) {
return query(b) - query(a - 1);
}
int bin_search(int val)
{
if (val < aib[1])
return -1;
int ans = 0;
for (int p = 17; p >= 0; p--)
{
int idx = ans + (1 << p);
if (idx > n) continue;
if (aib[idx] <= val)
{
ans += 1 << p;
val -= aib[ans];
}
}
if (val != 0)
return -1;
return ans;
}
int main()
{
ifstream in("aib.in");
ofstream out("aib.out");
in >> n >> m;
for (int i = 1; i <= n; i++) {
int x;
in >> x;
update(i, x);
}
int i = 1;
while(m--) {
int op;
in >> op;
switch(op) {
case 0:
int pos, val;
in >> pos >> val;
update(pos, val);
break;
case 1:
int a, b;
in >> a >> b;
out << query_int(a, b) << '\n';
break;
case 2:
int k;
in >> k;
out << bin_search(k) << '\n';
}
}
}