Pagini recente » Cod sursa (job #1651843) | Cod sursa (job #2978232) | Cod sursa (job #3163345) | Cod sursa (job #2648386) | Cod sursa (job #936925)
Cod sursa(job #936925)
#include <fstream>
using namespace std;
int main() {
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
fin >> n >> m;
int a[n+1];
for (int i = 1; i <= n; ++i)
fin >> a[i];
for (int stp = 1; stp < n; stp *= 2)
for (int i = 2*stp; i <= n; i += 2*stp)
a[i] += a[i-stp];
int maxstp = 1;
while (maxstp <= n) maxstp *= 2;
maxstp /= 2;
int q, b, c, val;
for (; m > 0; --m) {
fin >> q;
if (q == 0) {
fin >> b >> val;
for (int stp = 1; b <= n; stp <<= 1) {
if (b & stp) {
a[b] += val;
b += stp;
}
}
}
else if (q == 1) {
fin >> b >> c;
--b;
val = 0;
for (int stp = 1; b != c; stp <<= 1) {
if (b & stp) {
val -= a[b];
b -= stp;
}
if (c & stp) {
val += a[c];
c -= stp;
}
}
fout << val << '\n';
}
else {
fin >> val;
b = 0;
for (int stp = maxstp; val > 0 && stp; stp >>= 1) {
if (b+stp <= n && val >= a[b+stp]) {
b += stp;
val -= a[b];
}
}
fout << (val == 0 && b > 0? b : -1) << '\n';
}
}
return 0;
}