Submission #1146077

#TimeUsernameProblemLanguageResultExecution timeMemory
1146077elotelo966Meteors (POI11_met)C++20
0 / 100
1132 ms37088 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
#define OYY LLONG_MAX
#define mod 1000000007
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define FOR for(int i=1;i<=n;i++)
#define mid (start+end)/2
#define lim 300005
#define fi first
#define se second
#define pb push_back
 
vector<pair<int,pair<int,int>>> qu;
 
vector<int> v[lim];
 
int n,m;
 
int dizi[lim],ger[lim],cev[lim],tree[4*lim];
 
inline void build(int node,int start,int end){
	if(start==end){
		tree[node]=0;
		return ;
	}
	build(node*2,start,mid),build(node*2+1,mid+1,end);
	tree[node]=0;
}
 
inline int query(int node,int start,int end,int l,int r){
	if(start>end || start>r || end<l)return 0;
	if(start>=l && end<=r)return tree[node];
	return query(node*2,start,mid,l,r)+query(node*2+1,mid+1,end,l,r);
}
 
inline void update(int node,int start,int end,int l,int r,int val){
	if(start>end || start>r || end<l)return ;
	if(start>=l && end<=r){
		tree[node]+=val;
		return ;
	}
	update(node*2,start,mid,l,r,val),update(node*2+1,mid+1,end,l,r,val);
	tree[node]=tree[node*2]+tree[node*2+1];
}
 
int32_t main(){
	faster
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>dizi[i];
		v[dizi[i]].pb(i);
	}
	
	FOR{
		cev[i]=-1;
		cin>>ger[i];
	}
	
	int q;cin>>q;
	
	for(int i=1;i<=q;i++){
		int l,r,z;cin>>l>>r>>z;
		qu.pb({l,{r,z}});
	}
	
	vector<int> tut;
	
	FOR{
		tut.pb(i);
	}
	
	int ind=0;
	
	queue<pair<int,pair<int,vector<int>>>> f;
	
	f.push({0,{q-1,tut}});
		
	while(f.size()){
		int l=f.front().fi,r=f.front().se.fi;
		//cout<<l<<" "<<r<<endl;
		vector<int> cur=f.front().se.se;
		vector<int> v1,v2;
		f.pop();
		if(l>r)continue;
		int mi=(l+r)/2;
		while(ind>mi){
			if(qu[ind].fi<=qu[ind].se.fi){
				update(1,1,m,qu[ind].fi,qu[ind].fi,-qu[ind].se.se);
				update(1,1,m,qu[ind].se.fi+1,qu[ind].se.fi+1,+qu[ind].se.se);
			}
			else{
				update(1,1,m,qu[ind].fi,qu[ind].fi,-qu[ind].se.se);
				update(1,1,m,1,1,-qu[ind].se.se);
				update(1,1,m,qu[ind].se.fi+1,qu[ind].se.fi+1,qu[ind].se.se);
			}
			ind--;
		}
		while(ind<=mi){
			if(qu[ind].fi<=qu[ind].se.fi){
				update(1,1,m,qu[ind].fi,qu[ind].fi,qu[ind].se.se);
				update(1,1,m,qu[ind].se.fi+1,qu[ind].se.fi+1,-qu[ind].se.se);
			}
			else{
				update(1,1,m,qu[ind].fi,qu[ind].fi,qu[ind].se.se);
				update(1,1,m,1,1,qu[ind].se.se);
				update(1,1,m,qu[ind].se.fi+1,qu[ind].se.fi+1,-qu[ind].se.se);
			}
			ind++;
		}
		
		//~ cout<<"k"<<endl;
		
		//~ for(int i=1;i<=m;i++){
			//~ cout<<query(1,1,m,i,i)<<" ";
		//~ }
		
		//~ cout<<endl;
		for(auto a:cur){
			int top=0;
			for(auto x:v[a]){
				top+=query(1,1,m,1,x);
			}
			//cout<<l<<" "<<r<<" "<<mi<<" "<<a<<" "<<top<<endl;
			if(top>=ger[a]){
				v1.pb(a);
			}
			else{
				v2.pb(a);
			}
		}
		
		//~ if(mi==q-1){
			//~ build(1,1,m);
			//~ memset(tree,0,sizeof(tree));
			//~ ind=0;
		//~ }
		
		if(l==r){
			for(auto a:v1){
				cev[a]=l+1;
			}
			continue;
		}
		else{
			if(v1.size())f.push({l,{mi,v1}});
			if(v2.size())f.push({mi+1,{r,v2}});
		}
	}
	
	FOR{
		if(~cev[i])cout<<cev[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...