Submission #1296282

#TimeUsernameProblemLanguageResultExecution timeMemory
1296282arianshabaaniMeteors (POI11_met)C++20
100 / 100
4893 ms27852 KiB
// #inclue <iostream>
#include <bits/stdc++.h>
using namespace std;
//ifstream fin("input.txt");
//ofstream fout("output.txt");

// #CONFIG
string outone = "YES";
string outtwo = "NO";

const int inf=1e9;
const int mod=1e9+7;
const int modd = 998244353;
const int maxn25=2*1e5+10;
const int maxn55=5*1e5+10;
const int maxn5=1e5+10;
const int maxn7=1e7+10;
const int maxn9=1e9+10;

#define ll long long int
#define ull unsigned long long int
#define pass cerr << "Pass shod!" << endl
#define testc ll tt; cin >> tt; while(tt--)
#define pb push_back
#define mp(i, j) make_pair(i, j)
#define moew cin.tie(0); cout.tie(0); ios::sync_with_stdio(false)
#define one first
#define two second
#define enld endl
#define neld endl
#define ednl endl
#define vectoR vector
#define cosnt const
#define ppq priority_queue
#define t1 __builtin_popcount
#define rip return 0
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef priority_queue<pll, vector<pll>, greater<pll>> pq;
typedef int itn;

void yes() { cout << "YES" << endl; }
void no() { cout << "NO" << endl; }
void out1() { cout << outone << endl; }
void out2() { cout << outtwo << endl; }
ll max3 (ll a, ll b, ll c) { return max(a, max(b, c)); }
ll min3 (ll a, ll b, ll c) { return min(a, min(b, c)); }
ll ceill (ll a, ll b) { return (a+b-1)/b; }
long double flor(long double a){ return floor(a+0.5); }
ll logg (ll a, ll b) { return log(a)/log(b); }

cosnt int maxn = 3e5+10;
int ans[maxn];
ll p[maxn];
bool mark[maxn];
ll j[maxn];
ll jj[maxn];
ll jq[maxn];
ll ps[maxn];
ll ne[maxn];
vector<int> a[maxn];
const int sq = 550;
vector<int> po;
vector<pair<pii, pii>> lq;

int main(){
    moew;
    int n, m;
    cin >> n >> m;
    for (int i=1; i<=m; i++){
        cin >> p[i];
        a[p[i]].pb(i);
    }
    for (int i=1; i<=n; i++){
        cin >> ne[i];
    }
    int q;
    cin >> q;
    for (int qq=1; qq<=q; qq++){
        ll b, c, d;
        cin >> b >> c >> d;
        if (b>c){
            ps[b]+=d;
            ps[1]+=d;
            ps[c+1]-=d;
        }else {
            ps[b]+=d;
            ps[c+1]-=d;
        }
        lq.pb({{b, c}, {d, qq}});
        if (qq%sq==0){
            po.clear();
            for (int i=1; i<=m; i++){
                ps[i]+=ps[i-1];
                jj[p[i]]+=ps[i];
                if (j[p[i]]+jj[p[i]]>=ne[p[i]] and !mark[p[i]]){
                    po.pb(p[i]);
                    mark[p[i]]=1;
                }
            }
            for (auto v : po){
                for (auto [k, ki] : lq){
                    auto [b, c] = k;
                    auto [d, in]=ki;
                    ll an = 0;
                    for (auto u : a[v]){
                        if (b>c){
                            if ((u>=1 and u<=c) or (u>=b and u<=m)){
                                an++;
                            }
                        }else {
                            if (u>=b and u<=c){
                                an++;
                            }
                        }
                    }
                    bool f = 0;
                    if (jq[v]+j[v]<ne[v]){
                        f=1;
                    }
                    jq[v]+=an*d;
                    if (jq[v]+j[v]>=ne[v] and f){
                        ans[v]=in;
                    }
                }
            }
            for (int i=1; i<=m; i++){
                ps[i]=0;
                j[p[i]]+=jj[p[i]];
                jj[p[i]]=0;
                jq[p[i]]=0;
            }
            lq.clear();
        }
    }
    po.clear();
    for (int i=1; i<=m; i++){
        ps[i]+=ps[i-1];
        jj[p[i]]+=ps[i];
        if (j[p[i]]+jj[p[i]]>=ne[p[i]] and !mark[p[i]]){
            po.pb(p[i]);
            mark[p[i]]=1;
        }
    }
    for (auto v : po){
        for (auto [k, ki] : lq){
            auto [b, c] = k;
            auto [d, in]=ki;
            ll an = 0;
            for (auto u : a[v]){
                if (b>c){
                    if ((u>=1 and u<=c) or (u>=b and u<=m)){
                        an++;
                    }
                }else {
                    if (u>=b and u<=c){
                        an++;
                    }
                }
            }
            bool f = 0;
            if (jq[v]+j[v]<ne[v]){
                f=1;
            }
            jq[v]+=an*d;
            if (jq[v]+j[v]>=ne[v] and f){
                ans[v]=in;
            }
        }
    }
    for (int i=1; i<=n; i++){
        if (ans[i]==0){
            cout << "NIE" << endl;
        }else {
            cout << ans[i] << endl;
        }
    }
}
#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...