제출 #1333985

#제출 시각아이디문제언어결과실행 시간메모리
1333985kenkunkin새로운 문제 (POI11_met)C++20
100 / 100
933 ms59736 KiB
#include <bits/stdc++.h>

using namespace std;

void Init()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

typedef long long ll;

const int maxn=300000+5;

int n,m,k;

int o[maxn];
ll p[maxn];

vector<int> pos[maxn];
vector<int> bucket[maxn];

int L[maxn],R[maxn],ans[maxn];

int l[maxn],r[maxn];
ll a[maxn];

ll bit[maxn];

void resetBIT()
{
    for(int i=1;i<=m;i++)
        bit[i]=0;
}

void add(int i,ll v)
{
    for(;i<=m;i+=i&-i)
        bit[i]+=v;
}

ll sum(int i)
{
    ll s=0;
    for(;i;i-=i&-i)
        s+=bit[i];
    return s;
}

void update(int L,int R,ll val)
{
    if(L<=R)
    {
        add(L,val);
        add(R+1,-val);
    }
    else
    {
        add(L,val);
        add(m+1,-val);
        add(1,val);
        add(R+1,-val);
    }
}

int main()
{
    Init();

    cin>>n>>m;

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

    for(int i=1;i<=n;i++)
        cin>>p[i];

    cin>>k;

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

    for(int i=1;i<=n;i++)
    {
        L[i]=1;
        R[i]=k;
        ans[i]=-1;
    }

    while(true)
    {
        bool done=true;

        for(int i=1;i<=k;i++)
            bucket[i].clear();

        for(int i=1;i<=n;i++)
        {
            if(L[i]<=R[i])
            {
                done=false;

                int mid=(L[i]+R[i])/2;

                bucket[mid].push_back(i);
            }
        }

        if(done) break;

        resetBIT();

        for(int i=1;i<=k;i++)
        {
            update(l[i],r[i],a[i]);

            for(int state:bucket[i])
            {
                ll s=0;

                for(int sector:pos[state])
                {
                    s+=sum(sector);

                    if(s>=p[state])
                        break;
                }

                if(s>=p[state])
                {
                    ans[state]=i;
                    R[state]=i-1;
                }
                else
                    L[state]=i+1;
            }
        }
    }

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