Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*ООО "Новые Железные Дороги" поручило вам разработать систему
- бронирования билетов на новый маршрут поезда дальнего следования.
- Маршрут проходит через N станций, занумерованных от 0 до N-1.
- Вместимость поезда ограничена.
- В систему бронирования последовательно приходят запросы от
- пассажиров с указанием номера начальной и конечной станции,
- а также количество билетов, которые пассажир хочет приобрести.
- Требуемая скорость обработки каждого запроса - .*/
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <utility>
- #include <algorithm>
- using namespace std;
- class SegmentTree {
- public:
- SegmentTree(const vector<int>& mas, const int N);
- void build(const vector<int>& mas);
- void update(int v, int tl, int tr, int a, int b, int data);
- int segment_max(int v, int tl, int tr, int a, int b);
- int get_size();
- private:
- int size_num = 0;
- vector<pair<int, int>> tree;
- };
- int main() {
- int n = 0;
- cin >> n;
- vector<int> tickets(n);
- for (int i = 0; i < n - 1; ++i) {
- int tmp = 0;
- cin >> tmp;
- tickets[i] = tmp;
- }
- int capacity = 0;
- cin >> capacity;
- SegmentTree tree(tickets, n);
- tree.build(tickets);
- int M = 0;
- cin >> M;
- for (int i = 0; i < M; ++i) {
- int tmp1 = 0;
- int tmp2 = 0;
- int tmp3 = 0;
- cin >> tmp1 >> tmp2 >> tmp3;
- if (tree.segment_max(0, 0, tree.get_size() - 1, tmp1, tmp2 - 1) >(capacity - tmp3)) {
- cout << i << " ";
- }
- else {
- tree.update(0, 0, tree.get_size() - 1, tmp1, tmp2 - 1, tmp3);
- }
- }
- }
- SegmentTree::SegmentTree(const vector<int>& mas, const int N) {
- size_num = 1 << (int)ceil(log2(N));
- tree.assign(2 * size_num - 1, make_pair(0, 0));
- }
- void SegmentTree::build(const vector<int>& mas) {
- for (int i = 0; i < mas.size(); ++i) {
- tree[(2 * size_num - 1) / 2 + i].first = mas[i];
- }
- for (int i = (2 * size_num - 1) / 2 - 1; i >= 0; i--) {
- tree[i].first = max(tree[2 * i + 1].first, tree[2 * i + 2].first);
- }
- }
- void SegmentTree::update(int v, int tl, int tr, int a, int b, int data) {
- if (a > b) {
- return;
- }
- else if (b == tr && a == tl) {
- tree[v].second += data;
- return;
- }
- else {
- int tm = tl + (tr - tl) / 2;
- update(2 * v + 1, tl, tm, a, min(b, tm), data);
- update(2 * v + 2, tm + 1, tr, max(a, tm + 1), b, data);
- tree[v].first = max(tree[2 * v + 1].first + tree[2 * v + 1].second, tree[2 * v + 2].first + tree[2 * v + 2].second);
- }
- }
- int SegmentTree::segment_max(int v, int tl, int tr, int a, int b) {
- if (a > b) {
- return 0;
- }
- else if (a == tl && b == tr) {
- return tree[v].first + tree[v].second;
- }
- else {
- int tm = tl + (tr - tl) / 2;
- int left_max = segment_max(2 * v + 1, tl, tm, a, min(tm, b));
- int right_max = segment_max(2 * v + 2, tm + 1, tr, max(tm + 1, a), b);
- int res = max(left_max, right_max) + tree[v].second;
- return res;
- }
- }
- int SegmentTree::get_size() {
- return size_num;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement