Submission #1329939

#TimeUsernameProblemLanguageResultExecution timeMemory
132993912345678Meteors (POI11_met)C++17
0 / 100
829 ms36220 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long

const ll nx = 3e5+5;

ll n,m,k,a[nx],req[nx],l[nx],r[nx];
tuple<ll,ll,ll> meteor[nx];
vector<ll> stations[nx];

struct fenwick
{
    ll fw[nx] = {};
    void add(int idx, ll x)
    {
        while(idx <= m) fw[idx]+=x, idx += (idx&-idx);
    }
    void clr()
    {
        for(int i = 1; i <= m; i++) fw[i] = 0;
    }
    ll query(int idx)
    {
        ll sum = 0;
        while(idx > 0) sum += fw[idx], idx -= (idx&-idx);
        return sum;
    }
} f;

int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n>>m;
    for(int i = 1; i <= m; i++) cin>>a[i], stations[a[i]].push_back(i);
    for(int i = 1; i <= n; i++) cin>>req[i];
    cin>>k;
    for(int i = 1; i <= k; i++)
    {
        ll le,ri,val; cin>>le>>ri>>val;
        meteor[i] = {le,ri,val};
    }
    for(int i = 1; i <= n; i++) l[i] = 1, r[i] = k+1;
    bool done = 0;
    while(!done)
    {
        done = 1;
        vector<vector<ll>> freq(k+2);
        for(int i = 1; i <= n; i++)
        {
            if(l[i]==r[i]) continue;
            else
            {
                done = 0;
                ll md = (l[i]+r[i])/2;
                freq[md].push_back(i);
            }
        }
        if(done) break;
        f.clr();
        for(int i = 1; i <= k+1; i++)
        {
            if(i!=k+1)
            {
                auto [left, right, val] = meteor[i];
                if(left<right) f.add(left,val), f.add(right+1,-val);
                else
                {
                    f.add(left,val);
                    f.add(1,val);
                    f.add(right+1,-val);
                }
            }
            for(auto idx : freq[i])
            {
                ll sum = 0;
                for(auto u : stations[idx])
                {
                    sum += f.query(u);
                    if (sum >= req[idx]) break;
                }
                if(sum >= req[idx]) r[idx] = i;
                else l[idx] = i+1;
            }
        }
    }
    for(int i = 1; i <= n; i++)
    {
        if(l[i]==k+1) cout<<"NIE\n";
        else cout<<l[i]<<"\n";
    }
}
#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...