#include <bits/stdc++.h>
#ifdef local
#include "../local.hpp"
#else
#define dbg(...)
#endif
using i64 = long long;
namespace cplib {
template <typename T> class fenwick_tree {
protected:
std::size_t n;
std::vector<T> a;
void init(std::size_t n_) {
n = n_;
a.assign(n, T{});
}
public:
fenwick_tree() { init(std::size_t(0)); }
explicit fenwick_tree(std::size_t _n) { init(_n); }
void add(std::size_t x, const T &v) {
for (std::size_t i = x + 1; i <= n; i += i & -i) {
a[i - 1] = a[i - 1] + v;
}
}
T sum(std::size_t x) {
T ans{};
for (std::size_t i = x; i > 0; i -= i & -i) {
ans = ans + a[i - 1];
}
return ans;
}
T sum(std::size_t l, std::size_t r) { return sum(r) - sum(l); }
std::size_t select(const T &k) {
std::size_t x = 0;
T cur{};
for (std::size_t i = 1 << std::__lg(n); i; i /= 2) {
if (x + i <= n && cur + a[x + i - 1] <= k) {
x += i;
cur = cur + a[x - 1];
}
}
return x;
}
};
} // namespace cplib
int32_t main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr), std::cout.tie(nullptr);
int n, m;
std::cin >> n >> m;
std::vector<int> o(m);
for (int i = 0; i < m; i++) {
auto &x = o[i];
std::cin >> x;
}
std::vector<int> p(n);
for (int i = 0; i < n; i++) {
auto &x = p[i];
std::cin >> x;
}
int k;
std::cin >> k;
std::vector<std::array<int, 3>> lra(k);
for (int i = 0; i < k; i++) {
auto &[l, r, a] = lra[i];
std::cin >> l >> r >> a;
l--;
r--;
}
std::map<int, std::vector<int>> ow;
for (int i = 0; i < m; i++) {
auto x = o[i];
ow[x].push_back(i);
}
cplib::fenwick_tree<int> fw(m);
std::vector<std::array<int, 2>> lr(n);
for (int i = 0; i < n; i++) {
lr[i] = {0, k - 1 + 1};
}
bool chk = true;
while (chk) {
chk = false;
fw = cplib::fenwick_tree<int>(m);
std::map<int, std::vector<int>> op;
for (int i = 0; i < n; i++) {
auto [l, r] = lr[i];
if (l == r) {
continue;
}
int m = l + (r - l) / 2;
op[m].push_back(i);
}
for (int i = 0; i < k; i++) {
{
auto [l, r, a] = lra[i];
if (l <= r) {
fw.add(l, a);
fw.add(r + 1, -a);
} else {
fw.add(l, a);
fw.add(0, a);
fw.add(r + 1, -a);
}
}
auto &v = op[i];
while (!v.empty()) {
chk = true;
auto x = *v.begin();
v.erase(v.begin());
int sum = 0;
for (auto oo : ow[x]) {
oo += fw.sum(oo);
if (oo >= p[x]) {
break;
}
}
if (sum >= p[x]) {
lr[x][1] = i;
} else {
lr[x][0] = i;
}
}
}
}
for (int i = 0; i < n; i++) {
auto [l, r] = lr[i];
if (l < k) {
std::cout << l + 1 << "\n";
} else {
std::cout << "NIE\n";
}
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
6072 ms |
344 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
6033 ms |
604 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
6008 ms |
6856 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
6042 ms |
7740 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
6046 ms |
6860 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
6050 ms |
6612 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
6010 ms |
50888 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
6011 ms |
49544 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |