Submission #1244904

#TimeUsernameProblemLanguageResultExecution timeMemory
1244904dreamoonMeteors (POI11_met)C++17
74 / 100
6090 ms30680 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll zero = 0;
const ll mod = 998244353;
// const ll C=131;
// const ll inf=1e17;
const int len = 300;
const int t = 4;
#define Fi first
#define Se second
#define PB push_back
#define P pair<ll, ll>
#define ppl pair<P, ll>
#define LB lower_bound
#define UB upper_bound
#define SZ size()
#define BE begin()
#define EN end()
#define CON continue
#define RB rbegin()
#define EM empty()
struct BIT {
    vector<ll> bit;
    int sz;
    void init(int N) {
        bit.resize(N + 3);
        sz = N + 2;
        for (int i = 0; i <= sz; i++) {
            bit[i] = 0;
        }
    }
    void ins(int p, ll x) {
        for (; p <= sz; p += p & -p) {
            bit[p] += x;
        }
    }
    ll prS(int p) {
        ll out = 0;
        for (; p; p -= p & -p) {
            out += bit[p];
        }
        return out;
    }
} Bit;
struct QQ {
    int L, R;
    vector<int> num;
};
int M, K, Q, Y, X, big, N, T, now, H, S = 0;
// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
vector<vector<ll>> sta;
queue<QQ> pool;
vector<ll> need;
int l[300005], r[300005];
ll v[300005];
int ans[300005] = {};
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M;
    need.resize(N + 1);
    sta.resize(N + 1);
    for (int i = 1; i <= M; i++) {
        int x;
        cin >> x;
        sta[x].PB(i);
    }
    for (int i = 1; i <= N; i++) {
        cin >> need[i];
    }
    cin >> Q;
    for (int i = 1; i <= Q; i++) {
        cin >> l[i] >> r[i] >> v[i];
    }
    QQ ini;
    ini.L = 1;
    ini.R = Q + 1;
    for (int i = 1; i <= N; i++) {
        ini.num.PB(i);
    }
    int nd = 0;
    pool.push(ini);
    Bit.init(M);
    while (pool.SZ) {
        QQ A = pool.front();
        pool.pop();
        if (A.L >= A.R) {
            for (int x : A.num) {
                ans[x] = A.L;
            }
            CON;
        }
        int mm = A.L + A.R >> 1;

        if (mm < nd) {
            nd = 0;
            Bit.init(M);
        }
        for (; nd < mm; nd++) {
            if (l[nd + 1] <= r[nd + 1]) {
                Bit.ins(l[nd + 1], v[nd + 1]);
                Bit.ins(r[nd + 1] + 1, -v[nd + 1]);
            } else {
                Bit.ins(1, v[nd + 1]);
                Bit.ins(l[nd + 1], v[nd + 1]);
                Bit.ins(r[nd + 1] + 1, -v[nd + 1]);
            }
        }
        QQ small, big;
        small.L = A.L;
        small.R = mm;
        big.L = mm + 1;
        big.R = A.R;
        vector<ll> cnt;
        cnt.resize(N + 1);
        for (int x : A.num) {
            cnt[x] = 0;
            for (int p : sta[x]) {
                if (cnt[x] < need[x])
                    cnt[x] += Bit.prS(p);
            }
        }
        for (int x : A.num) {
            if (cnt[x] >= need[x]) {
                small.num.PB(x);
            } else {
                big.num.PB(x);
            }
        }
        /*
                cout<<endl<<mm<<":"<<endl<<endl;
                for(int x:A.num){
                    cout<<x<<" ";
                }
                cout<<endl;
                for(int x:A.num){
                    cout<<cnt[x]<<" ";
                }
                cout<<endl;
        */
        pool.push(small);
        pool.push(big);
    }
    for (int i = 1; i <= N; i++) {

        if (ans[i] > Q) {
            cout << "NIE";
        } else
            cout << ans[i];
        if (i < N) {
            cout << '\n';
        }
    }
}
/*
3 5
1 3 2 1 3
10 5 7
3
4 2 4
1 3 1
3 5 2
*/
#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...