Submission #1346537

#TimeUsernameProblemLanguageResultExecution timeMemory
1346537warrennMeteors (POI11_met)C++20
62 / 100
861 ms46148 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
#pragma GCC optimize("O3,unroll-loops")

int n,m;
const int maxn=3e5;
vector<int>bit(maxn+2,0);

void upd(int idx,int val){
    for(int q=idx;q<=maxn;q+=(q&(-q))){
        bit[q]+=val;
    }
}

int query(int idx){
    int tot=0;
    for(int q=idx;q>0;q-=(q&(-q))){
        tot+=bit[q];
    }
    return tot;
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    vector<int>pos[n+1];

    for(int q=1;q<=m;q++){
        int o; cin>>o;
        pos[o].push_back(q);
    }
    int p[n+1],l[n+1],r[n+1],ans[n+1];
    for(int q=1;q<=n;q++){
        cin>>p[q];
    }

    int k; cin>>k;
    int posl[k+1],posr[k+1],mid[k+1],a[k+1];
    for(int q=1;q<=k;q++){
        cin>>posl[q]>>posr[q]>>a[q];
    }

    for(int q=1;q<=n;q++){
        l[q]=1,r[q]=k,ans[q]=-1;
    }

    vector<int>qu[k+1];
    while(true){
        bool stop=true;
        for(int q=1;q<=n;q++){
            if(l[q]<=r[q]){
                mid[q]=(l[q]+r[q])/2;
                stop=false;
                qu[mid[q]].push_back(q);
            }
        }
        if(stop)break;

        for(int q=1;q<=k;q++){
            if(posl[q]<=posr[q]){
                upd(posl[q],a[q]);
                upd(posr[q]+1,-a[q]);
            }
            else{
                upd(1,a[q]);
                upd(posr[q]+1,-a[q]);
                upd(posl[q],a[q]);
            }

            for(auto idx : qu[q]){
                int tot=0;
                for(auto b : pos[idx]){
                    tot+=query(b);
                }
                if(tot>=p[idx]){
                    r[idx]=mid[idx]-1;
                    ans[idx]=mid[idx];
                }
                else{
                    l[idx]=mid[idx]+1;
                }
            }
            qu[q].clear();
        }

        for(int q=1;q<=k;q++){
            if(posl[q]<=posr[q]){
                upd(posl[q],-a[q]);
                upd(posr[q]+1,a[q]);
            }
            else{
                upd(1,-a[q]);
                upd(posr[q]+1,a[q]);
                upd(posl[q],-a[q]);
            }
        }
    }

    for(int q=1;q<=n;q++){
        if(ans[q]==-1){
            cout<<"NIE"<<endl;
        }
        else{
            cout<<ans[q]<<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...