Submission #1361273

#TimeUsernameProblemLanguageResultExecution timeMemory
1361273dabper13Meteors (POI11_met)C++20
100 / 100
693 ms31680 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using pii=pair<int,int>;
const int maxn=3e5+5;
ll bit[maxn];
vector<int>pos[maxn];
int l[maxn],r[maxn],a[maxn],p[maxn];


void bit_clear(){
    memset(bit,0,sizeof(bit));
}

void add(int x,ll d){
    while(x<maxn){
        bit[x]+=d;
        x+=x&-x;
    }
}
 
ll query(int x){
    ll res=0;
    while(x){
        res+=bit[x];
        x-=x&-x;
    }
    return res;
}


int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n,m;cin>>n>>m;
    for(int i=1;i<=m;i++){
        int tmp;cin>>tmp;
        pos[tmp].push_back(i);
    }
    for(int i=1;i<=n;i++){
        cin>>p[i];
    }

    int k;cin>>k;
    for(int i=1;i<=k;i++){
        cin>>l[i]>>r[i]>>a[i];
    }

    queue<tuple<int,int,vector<int>>>q;
    {
        vector<int>tmp(n);
        iota(tmp.begin(),tmp.end(),1);
        q.push({1,k+1,tmp});
    }

    int ptr=0;
    vector<int>ans(n+1);
    while(!q.empty()){
        auto[low,hi,pool]=q.front();
        q.pop();
        if(low==hi){
            for(int i:pool){
                ans[i]=low;
            }
            continue;
        }

        int mid=low+(hi-low)/2;
        if(mid<ptr){
            bit_clear();
            ptr=0;
        }
        while(ptr<mid){
            ptr++;
            add(l[ptr],a[ptr]);
            add(r[ptr]+1,-a[ptr]);
            if(l[ptr]>r[ptr]){
                add(1,a[ptr]);
            }
        }

        vector<int>sid,bid;
        for(int i:pool){
            ll need=p[i];
            for(int j:pos[i]){
                need-=query(j);
                if(need<=0)break;
            }
            if(need<=0)sid.push_back(i);
            else bid.push_back(i);
        }

        if(!sid.empty())q.push({low,mid,sid});
        if(!bid.empty())q.push({mid+1,hi,bid});
    }

    for(int i=1;i<=n;i++){
        if(ans[i]==k+1)cout<<"NIE\n";
        else cout<<ans[i]<<'\n';
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...