제출 #1296298

#제출 시각아이디문제언어결과실행 시간메모리
1296298hoseiintech새로운 문제 (POI11_met)C++20
100 / 100
1954 ms26884 KiB
/* In The Name Of Allah */

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pb push_back
#define mp make_pair
#define all(x) x.begin() , x.end()
#define ff first
#define ss second
#define pii pair<ll, ll>
#define debug(a, b) cout << a << ' ' << b << '\n'
#define wall cout << "-----------------------------" << '\n';
#define sep ' '
#define int long long int

void fastIO() {
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
}

const ll N = 5e5 + 5;
const ll M = 1000 + 5;
const ll SQ = 550;
const ll LG = 32;
const ll INF = 1e18;
const ll MOD = 1e9 + 7;


inline ll mod(ll x){ x %= MOD; return (x < 0 ? x + MOD : x);}

// ll mpow(ll a, ll b){
//     if (b == 0)
//         return 1LL;
//     ll ret = mpow(a, b >> 1);
//     ret = (ret * ret) % MOD;

//     if (b & 1)
//         ret = (ret * a) % MOD;

//     return ret;
// }

// ll bmm(ll a, ll b){
//     return (b ? bmm(b, a % b) : a);
// }

// ll kmm(ll a, ll b){
//     return (a*b/bmm(a, b));
// }

// ll lgg2(ll x){
//     int ans = 0;
//     int val = 1;
//     while(val < x){
//         val *= 2;
//         ans++;
//     }
//     return ans;
// }

int p[N], num[N], nump[N], cc[N], ans[N];
vector<int> c[N];

void solve(){
    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= m; i++){
        int ty; cin >> ty;
        c[ty].pb(i);
    }
    for (int i = 1; i <= n; i++) cin >> p[i];

    int q; cin >> q;
    int tmp = q;

    int o = 1;
    vector<pair<pii, pii>> v;

    while (q--){
        int l, r, x;
        cin >> l >> r >> x;

        if (l <= r){
            v.pb({{l, r}, {x, tmp-q}});
        }
        else {
            v.pb({{l, m}, {x, tmp-q}});
            v.pb({{1, r}, {x, tmp-q}});
        }
        
        if (o == SQ || q == 0){
            vector<int> diff(m+2, 0);
            for (auto op: v){
                l = op.ff.ff, r = op.ff.ss, x = op.ss.ff;
                diff[l] += x;
                diff[r+1] -= x;
            }
            for (int i = 1; i <= m; i++){
                diff[i] += diff[i-1];
                cc[i] += diff[i];
            }
            for (int i = 1; i <= n; i++){
                num[i] = 0;
                for (int id : c[i]) num[i] += cc[id];
            }

            for (int i = 1; i <= n; i++){
                if (num[i] >= p[i] && ans[i] == 0){
                    bool f = false;

                    for (auto op: v){
                        if (f == true) break;

                        l = op.ff.ff, r = op.ff.ss, x = op.ss.ff;
                        int d = op.ss.ss;

                        for (int id : c[i]){
                            if (f == true) break;

                            if (id >= l && id <= r){
                                nump[i] += x;
                                if (nump[i] >= p[i]){
                                    ans[i] = d;
                                    f = true;
                                }
                            }
                        }
                    }
                }
            }

            for (int i = 1; i <= n; i++) nump[i] = num[i];
            v.clear();
            o = 0;
        }

        o++;
    }

    for (int i = 1; i <= n; i++){
        if (ans[i] == 0){
            cout << "NIE" << '\n';
        }
        else {
            cout << ans[i] << '\n';
        }
    }


}

signed main() {
    fastIO();

    int t = 1;
    //cin >> t;

    while (t--)
        solve();
}
#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...