Submission #1213724

#TimeUsernameProblemLanguageResultExecution timeMemory
1213724Trn115Meteors (POI11_met)C++20
100 / 100
806 ms40932 KiB
#include <bits/stdc++.h>

#define int unsigned long long
#define fi first
#define se second
#define all(v) v.begin(), v.end()

using namespace std;
using pii = pair<int, int>;

struct Fenwick
{
    int n;
    vector<int> bit;

    Fenwick() = default;
    Fenwick(int n)
    {
        this->n = n;
        bit.assign(n + 1, 0);
    }

    void add(int p, int x)
    {
        if (p == 0) return;
        for (; p <= n; p += p&-p) bit[p] += x;
    }

    int get(int p)
    {
        int res = 0;
        for (; p >= 1; p -= p&-p) res += bit[p];
        return res;
    }

    void d_add(int l, int r, int x)
    {
        add(l, x);
        add(r + 1, -x);
    }
};

struct Query
{
    int l, r, a;
};

signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    if (fopen("source.inp", "r"))
    {
        freopen("source.inp", "r", stdin);
        freopen("source.out", "w", stdout);
    }

    int n, m;
    cin >> n >> m;
    vector<vector<int>> o(n + 1);
    for (int i = 1; i <= m; ++i)
    {
        int x; cin >> x;
        o[x].push_back(i);
    }
    vector<int> p(n + 1);
    for (int i = 1; i <= n; ++i) cin >> p[i];
    int k;
    cin >> k;
    vector<Query> qs(k + 1);
    for (int i = 1; i <= k; ++i) cin >> qs[i].l >> qs[i].r >> qs[i].a;

    vector<pii> lr(n + 1, {1, k + 1});
    bool run = true;
    while (run)
    {
        run = false;
        vector<vector<int>> curq(k + 1);
        for (int i = 1; i <= n; ++i)
        {
            if (lr[i].fi < lr[i].se)
            {
                run = true;
                int mid = (lr[i].fi + lr[i].se) / 2;
                curq[mid].push_back(i);
            }
        }

        Fenwick fen(m);
        for (int i = 1; i <= k; ++i)
        {
            auto [l, r, a] = qs[i];
            if (l > r)
            {
                fen.d_add(l, m, a);
                fen.d_add(1, r, a);
            }
            else
            {
                fen.d_add(l, r, a);
            }

            for (int id : curq[i])
            {
                int sum = 0;
                for (int x : o[id]) sum += fen.get(x);

                auto &[l, r] = lr[id];
                if (sum >= p[id])
                {
                    r = i;
                }
                else
                {
                    l = i + 1;
                }
            }
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        if (lr[i].fi == k + 1)
        {
            cout << "NIE\n";
        }
        else
        {
            cout << lr[i].fi << "\n";
        }
    }
}

Compilation message (stderr)

met.cpp: In function 'int main()':
met.cpp:53:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   53 |         freopen("source.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
met.cpp:54:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |         freopen("source.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...