Pagini recente » Istoria paginii runda/oni_5 | Istoria paginii runda/aib/clasament | Cod sursa (job #1337553) | Istoria paginii runda/shimulare/clasament | Cod sursa (job #2857943)
#include <cstdio>
#include <cstdlib>
#include <exception>
#include <iostream>
#define SZ 1000001
static int N;
static constexpr int zeroes(int x) {
return (x & (-x));
}
enum op {
ADD = 0,
SUM = 1,
SHIT = 2
};
class aib {
private:
int v[SZ];
public:
void add(int p, int x) {
for (int i = p; i <= N; i += zeroes(i)) {
v[i] += x;
}
}
int sum(int p) {
int r = 0;
for (int i = p; i > 0; i -= zeroes(i)) {
r += v[i];
}
return r;
}
int thatOneShittyFunction(int x) {
int pas = 1 << 16;
int r = 0;
int sum = 0;
while (static_cast<bool>(pas)) {
if (pas + r <= N && sum + v[pas + r] <= x) {
r += pas;
sum += v[r];
}
pas /= 2;
if (sum == x) { return r; }
}
return -1;
}
};
int main([[maybe_unused]]int argc, [[maybe_unused]]char** argv) {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
aib bittree;
std::cin >> N;
int M = 0;
std::cin >> M;
for (auto i = 0; i < N; i++) {
int foo = 0;
std::cin >> foo;
bittree.add(i + 1, foo);
}
for (auto i = 0; i < M; i++) {
int op = 0;
std::cin >> op;
switch (op) {
case op::ADD:
{
int p = 0;
int x = 0;
std::cin >> p >> x;
bittree.add(p, x);
}
break;
case op::SUM:
{
int x = 0;
int y = 0;
std::cin >> x >> y;
int sum = bittree.sum(y) - bittree.sum(x - 1);
printf("%u\n", sum);
}
break;
case op::SHIT:
{
int x = 0;
std::cin >> x;
printf("%i\n", bittree.thatOneShittyFunction(x));
}
break;
default:
std::terminate();
}
}
return 0;
}