제출 #1154398

#제출 시각아이디문제언어결과실행 시간메모리
1154398Pichon5새로운 문제 (POI11_met)C++20
74 / 100
1051 ms86292 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define endl "\n"
#define int long long
 
const int N=3e5+5;
 
int n, m, q;
int a[N], reqd[N];
int ql[N], qr[N], qa[N];
int lo[N], mid[N], hi[N];
vector<int> vec[N], owns[N];
int bit[N];
 
void update(int idx, int val)
{
	while(idx<=m)
	{
		bit[idx]+=val;
		idx+=idx&-idx;
	}
}
 
int pref(int idx)
{
	int ans=0;
	while(idx>0)
	{
		ans+=bit[idx];
		idx-=idx&-idx;
	}
	return ans;
}
 
void clear()
{
	memset(bit, 0, sizeof(bit));	
}
 
void apply(int idx)
{
	if(ql[idx] <= qr[idx])
		update(ql[idx], qa[idx]), update(qr[idx]+1, -qa[idx]);
	else
	{
		update(1, qa[idx]);
		update(qr[idx]+1, -qa[idx]);
		update(ql[idx], qa[idx]);
	}
}
 
bool check(int idx)
{
	int req=reqd[idx];
	for(auto &it:owns[idx])
	{
		req-=pref(it);
		if(req<0)
			break;
	}
	if(req<=0)
		return 1;
	return 0;
}	
 
void work()
{	
	for(int i=1;i<=q;i++)
		vec[i].clear();
	for(int i=1;i<=n;i++)
		if(mid[i]>0)
			vec[mid[i]].push_back(i);
	clear();
	for(int i=1;i<=q;i++)
	{
		apply(i);
		for(auto &it:vec[i])
		{
			if(check(it))
				hi[it]=i;
			else
				lo[it]=i+1;
		}
	}
}
 
void parallel_binary()
{
	for(int i=1;i<=n;i++)
		lo[i]=1, hi[i]=q+1;
	bool changed = 1;
	while(changed)
	{
		changed=0;
		for(int i=1;i<=n;i++)
		{
			if(lo[i]<hi[i])
			{
				changed=1;
				mid[i]=(lo[i] + hi[i])/2;
			}	
			else
				mid[i]=-1;
		}
		work();
	}
}	
 
int32_t main()
{
	IOS;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>a[i];
		owns[a[i]].push_back(i);
	}
	for(int i=1;i<=n;i++)
		cin>>reqd[i];
	cin>>q;
	for(int i=1;i<=q;i++)
		cin>>ql[i]>>qr[i]>>qa[i];
	parallel_binary();
	for(int i=1;i<=n;i++)
	{
		if(lo[i]<=q)
			cout<<lo[i]<<endl;
		else
			cout<<"NIE"<<endl;
	}
	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...