제출 #1354923

#제출 시각아이디문제언어결과실행 시간메모리
1354923kokoxuya새로운 문제 (POI11_met)C++20
74 / 100
1942 ms131072 KiB
#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define pb push_back
#define mp make_pair
#define lsb(x) (x&(-x))
#define pii pair<int,int>
#define ss second
#define ff first
#define piii pair<int,pii>
#define debu(x) (cerr << #x  << " = "<< x << "\n")
#define debu2(x,y) (cerr << #x  << " = "<< x << " " << #y << " = " << y << "\n")
#define debu3(x,y,z) (cerr << #x  << " = "<< x << " " << #y << " = " << y << " " << #z << " = " << z<< "\n")
#define bitout(x,y) {\
	cerr << #x << " : ";\
	for (int justforbits = y; justforbits >=0; justforbits--)cout << (((1 << justforbits) & x)>=1);\
	cout << "\n";\
}
#define rangeout(j,rangestart,rangeend) {\
	cerr << "outputting " << #j<< ":\n";\
	for (int forrang = rangestart; forrang <= rangeend; forrang++)cerr << j[forrang] << " ";\
	cerr<<"\n";\
}
#define c1 {cerr << "Checkpoint 1! \n\n";cerr.flush();}
#define c2 {cerr << "Checkpoint 2! \n\n";cerr.flush();}
#define c3 {cerr << "Checkpoint 3! \n\n";cerr.flush();}
#define c4 {cerr << "Checkpoint 4! \n\n";cerr.flush();}
#define vi vector<int>
#define fr(i,x,y) for(int i=x;i<=y;i++)
#define defN 300002
//possibly overflow idk
//GYATT you mixed up n and m omiGYATT

vector<int>sg(4*defN,0);
int n,m;

void update(int s, int e, int cn, int pos, int val)
{
	if(s==e){sg[cn]+=val;return;}
	
	int m=(s+e)/2;
	if(pos<=m){update(s,m,cn<<1,pos,val);}
	else {update(m+1,e,(cn<<1)|1,pos,val);}
	
	sg[cn]=sg[cn<<1]+sg[(cn<<1)|1];
}

int query(int s, int e, int cn, int reqs, int reqe)
{
	if(reqs<=s&&reqe>=e){return sg[cn];}
	
	int m=(s+e)/2;
	
	int ans=0;
	if(reqs<=m)ans+=query(s,m,cn<<1,reqs,reqe);
	if(reqe>m)ans+=query(m+1,e,(cn<<1)|1,reqs,reqe);
	return ans;
}

void dofor(piii t6)
{
	//debu3(t6.ss.ff,t6.ss.ss,t6.ff);
	update(1,m+1,1,t6.ss.ff,t6.ff);
	update(1,m+1,1,t6.ss.ss+1,-t6.ff);
}

signed main()
{
    int t1,t2,t3,t4;
    mt19937_64 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	
	cin>>n>>m;
	vector<vi>myorbs(n+1);
	vector<int>ni(n+1);
	
	fr(i,1,m){cin>>t1;myorbs[t1].pb(i);}
	fr(i,1,n){cin>>ni[i];}
	
	int k;cin>>k;
	vector<piii>strikes;
	fr(i,1,k){cin>>t1>>t2>>t3;strikes.pb(mp(t3,mp(t1,t2)));}
	
	fr(i,0,k-1)
	{
		piii t6=strikes[i];
		
		if(t6.ss.ff>t6.ss.ss)
		{
			dofor(mp(t6.ff,mp(t6.ss.ff,m)));
			dofor(mp(t6.ff,mp(1,t6.ss.ss)));
		}
		else dofor(t6);
	}
	
	//c2;
	vector<bool>ans(n+1,true);
	fr(i,1,n)
	{
		int amt=0;
		for(int orbit:myorbs[i])
		{
			amt+=query(1,m+1,1,1,orbit);
		}
		//debu3(i,amt,ni[i]);
		
		if(amt<ni[i]){ans[i]=false;}
	}
	//c3;
	
	
	int haixu=n;
	vector<vector<vi>>mids;
	vector<pii>urs(n+1);
	
	fr(i,1,n){urs[i]=mp(0,k);}
	mids.pb(vector<vi>(k+1));
	fr(i,1,n){mids.back()[k/2].pb(i);}
	
	while(haixu>0)
	{
		vector<vi>t5(k+1);
		fill(sg.begin(),sg.end(),0);
		
		for(int i=1;i<=k;i++)
		{
			piii t6=strikes[i-1];
			if(t6.ss.ff>t6.ss.ss)
			{
				dofor(mp(t6.ff,mp(t6.ss.ff,m)));
				dofor(mp(t6.ff,mp(1,t6.ss.ss)));
			}
			else dofor(t6);
			
			for(int x:mids.back()[i])
			{
				int hi=urs[x].ss,lo=urs[x].ff;
				int amt=0;
				for(int ii:myorbs[x])
				{
					amt+=query(1,m+1,1,1,ii);
				}
				
				if(amt>=ni[x])
				{
					hi=i;
				}
				else
				{
					lo=i;
				}
				
				urs[x]=mp(lo,hi);
				if(hi-lo<=1)haixu--;
				else
				{
					t5[(hi+lo)/2].pb(x);
				}
			}
		}
		
		mids.pb(t5);
	}
	
	//c1;
	fr(i,1,n)
	{
		if(ans[i])cout<<urs[i].ss;
		else cout<<"NIE";
		cout<<"\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...