Pagini recente » Cod sursa (job #3154759) | Cod sursa (job #2058090) | Cod sursa (job #3220045) | Cod sursa (job #3356052) | Cod sursa (job #3313229)
#include <iostream>
#include <fstream>
#include <stdint.h>
const int32_t MAX_N = 100000;
const int32_t MAX_N_POW_2 = 1 << 16;
int32_t n, m;
int32_t sum[MAX_N + 1];
void AddVal(int32_t ind, int32_t val) {
for(int32_t i = ind; i <= n; i += i & ~(i - 1))
sum[i] += val;
}
int32_t GetSum(int32_t ind) {
int32_t res = 0;
for(int32_t i = ind; i; i -= i & ~(i - 1))
res += sum[i];
return res;
}
int32_t SearchSum(int32_t val) {
int32_t pos = 0, total = 0;
for(int32_t step = MAX_N_POW_2; step; step >>= 1) {
if(pos + step <= n && total + sum[pos + step] <= val) {
pos += step;
total += sum[pos];
}
}
if(total == val) {
return pos;
} else {
return -1;
}
}
int main() {
std::ifstream fin("aib.in");
std::ofstream fout("aib.out");
fin >> n >> m;
for(int32_t i = 1; i <= n; ++i) {
int32_t val;
fin >> val;
AddVal(i, val);
}
for(int32_t i = 1; i <= m; ++i) {
int32_t c;
fin >> c;
if(c == 0) {
int32_t a, b;
fin >> a >> b;
AddVal(a, b);
} else if(c == 1) {
int32_t a, b;
fin >> a >> b;
fout << (GetSum(b) - GetSum(a - 1)) << '\n';
} else {
int32_t a;
fin >> a;
fout << SearchSum(a) << '\n';
}
}
fin.close();
fout.close();
return 0;
}