Submission #1292653

#TimeUsernameProblemLanguageResultExecution timeMemory
1292653aliete새로운 문제 (POI11_met)C++20
100 / 100
1579 ms27072 KiB
// In the name of Allah //
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define pb push_back
#define S second
#define F first
typedef pair<int,int> pii;
typedef pair<int,pii> pip;
const int N=300000+5;
const int inf = 1e9;

int n , m , sq;
int g[N];
ll p[N];
int a[N];
int ans[N];
ll cnt[N];
ll cnt2[N];
vector<int> ch[N];

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

    int q;
    cin >> n >> m;
    for(int i=1 ; i<=m ; i++)
	{
        cin >> g[i];
        ch[g[i]].pb(i);
    }
    for(int i=1 ; i<=n ; i++) 
		cin >> a[i];

    cin >> q;
    sq = max(1 , (int)sqrt(q));

    vector<pip> qu;
    qu.reserve(q+5);

    int ii = 0;
    int cn = 0;

    while(q--)
    {
        int l , r , v;
        cin >> l >> r >> v;
        ii++; cn++;

        qu.pb({v,{l,r}});

        if(l <= r)
        {
            p[l] += v;
            if(r+1 <= m) p[r+1] -= v;
        }
        else
        {
            p[l] += v;
            if(m+1 <= m+1) p[m+1] -= v;
            p[1] += v;
            if(r+1 <= m) p[r+1] -= v;
        }

        if(cn == sq || q == 0)
        {
            for(int i=1 ; i<=m ; i++) 
				p[i] += p[i-1];

            for(int i=1 ; i<=n ; i++) 
				cnt2[i] = cnt[i];

            for(int i=1 ; i<=m ; i++)
			{
                if(p[i] != 0) 
				{
                    cnt[g[i]] += p[i];
                }
            }

            vector<int> ok;
            ok.reserve(64);
            for(int i=1 ; i<=n ; i++)
			{
                if(cnt[i] >= a[i] && cnt2[i] < a[i]) ok.pb(i);
            }

            int si = ii - cn;
            int ei = ii - 1;

            for(int st : ok)
            {
                if(ans[st] != 0) continue;
                ll cur = cnt2[st];
                for(int j=si ; j<=ei ; j++)
                {
                    int lq = qu[j].S.F;
                    int rq = qu[j].S.S;
                    int vq = qu[j].F;

                    int add_cnt = 0;
                    if(!ch[st].empty())
					{
                        if(lq <= rq)
						{
                            auto lo = lower_bound(ch[st].begin(), ch[st].end(), lq);
                            auto hi = upper_bound(ch[st].begin(), ch[st].end(), rq);
                            add_cnt = int(hi - lo);
                        } 
						else 
						{
                            auto lo1 = lower_bound(ch[st].begin(), ch[st].end(), lq);
                            auto hi1 = upper_bound(ch[st].begin(), ch[st].end(), m);
                            auto lo2 = lower_bound(ch[st].begin(), ch[st].end(), 1);
                            auto hi2 = upper_bound(ch[st].begin(), ch[st].end(), rq);
                            add_cnt = int(hi1 - lo1) + int(hi2 - lo2);
                        }
                    }

                    if(add_cnt) cur += 1LL * add_cnt * vq;

                    if(cur >= a[st])
					{
                        ans[st] = j + 1;
                        break;
                    }
                }
            }

            for(int i=1 ; i<=m+1 ; i++) p[i] = 0;

            cn = 0;
        }
    }

    for(int i=1; i<=n; ++i){
        if(ans[i] != 0) cout << ans[i] << "\n";
        else cout << "NIE\n";
    }

    return 0;
}
#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...