Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 223 si 131 | Cod sursa (job #119061) | Cod sursa (job #1785268) | Cod sursa (job #1001895) | Cod sursa (job #2829153)
#include <fstream>
#include <cmath>
using namespace std;
const int N = 1e5 + 5;
int aib[N], n;
int zeros(int x) {
return x ^ (x & (x - 1));
}
void update(int poz, int add) {
while (poz <= n) {
aib[poz] += add;
poz += zeros(poz);
}
}
int query(int poz) {
int rez = 0;
while (poz > 0) {
rez += aib[poz];
poz -= zeros(poz);
}
return rez;
}
int cbin(int sum) {
int p2max = log2(n), poz = 0;
for (int i = p2max; i >= 0; --i) {
int p2 = (1 << i);
if (poz + p2 <= n && aib[poz + p2] <= sum) {
sum -= aib[poz + p2];
poz += p2;
}
}
if (sum > 0)
return -1;
return poz;
}
int main() {
ifstream cin("aib.in");
ofstream cout("aib.out");
int q;
cin >> n >> q;
for (int i = 1; i <= n; ++i) {
int val;
cin >> val;
update(i, val);
}
while (q--) {
int cer;
cin >> cer;
if (cer == 0) {
int poz, add;
cin >> poz >> add;
update(poz, add);
} else if (cer == 1) {
int a, b;
cin >> a >> b;
cout << query(b) - query(a - 1) << "\n";
} else {
int poz;
cin >> poz;
cout << cbin(poz) << "\n";
}
}
cin.close();
cout.close();
return 0;
}