Pagini recente » Cod sursa (job #200267) | Cod sursa (job #211077) | Cod sursa (job #360498) | Cod sursa (job #2054824) | Cod sursa (job #3334338)
#include <bits/stdc++.h>
using namespace std;
#define ll int
#define LSB(x) (x & -x)
// #define fi cin
// #define fo cout
string FILENAME = "aib";
ifstream fi (FILENAME + ".in");
ofstream fo (FILENAME + ".out");
vector<ll> aib;
ll n, m, maxpow = 1;
void update(ll, ll);
ll q1(ll);
ll q2(ll);
int main() {
fi >> n >> m;
aib.resize(n + 1);
for(ll i = 1, x; i <= n; ++i) {
fi >> x;
update(i, x);
if(1 << (maxpow + 1) == i)
++maxpow;
}
for(ll q; m && fi >> q; --m)
if(!q) {
ll a, b;
fi >> a >> b;
update(a, b);
}
else if (q == 1) {
ll a, b;
fi >> a >> b;
a = q1(a - 1);
b = q1(b);
fo << b - a << '\n';
}
else{
ll a;
fi >> a;
fo << q2(a);
}
return 0;
}
void update(ll pos, const ll val) {
for(; pos <= n; pos += LSB(pos))
aib[pos] += val;
}
ll q1(ll x) {
ll sum = 0;
for(; x > 0; x -= LSB(x))
sum += aib[x];
return sum;
}
ll q2(ll val) {
ll ans = 0;
for(ll p = maxpow; p >= 0 ; --p) {
if(aib[ans + (1 << p)] <= val) {
ans += (1 << p);
val -= aib[ans];
}
}
return ans;
}