Pagini recente » Cod sursa (job #2185939) | Cod sursa (job #861043) | Cod sursa (job #2435540) | Cod sursa (job #2083399) | Cod sursa (job #2416543)
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int MAXN = 1e5;
const int MAXM = 15e4;
const int MAXVAL = 1e4;
int n, m, t, a, b;
int aib[MAXN + 1];
void update(int poz, int val) {
while (poz <= n) {
aib[poz] += val;
poz += (poz & -poz);
}
}
int query(int poz) {
int sum = 0;
while (poz) {
sum += aib[poz];
poz -= (poz & -poz);
}
return sum;
}
int main() {
in >> n >> m;
for (int i = 1; i <= n; ++ i) {
in >> a;
update(i, a);
}
while (m --) {
in >> t;
if (t == 0) {
in >> a >> b;
update(a, b);
}
if (t == 1) {
in >> a >> b;
out << query(b) - query(a - 1) << '\n';
}
if (t == 2) {
in >> a;
int ans = 0, sum = 0;
for (int pas = 20; pas >= 0; -- pas) {
if (ans + (1 << pas) <= n && sum + aib[ans + (1 << pas)] <= a) {
ans += 1 << pas;
sum += aib[ans];
}
}
if (sum != a) out << -1 << '\n';
else out << ans - 1 << '\n';
}
}
return 0;
}