Submission #1256443

#TimeUsernameProblemLanguageResultExecution timeMemory
1256443PieArmyFood Court (JOI21_foodcourt)C++20
100 / 100
610 ms116996 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
using namespace std;

struct Seg{
	#define mid ((left+right)>>1)
	#define sol node*2,left,mid
	#define sag node*2+1,mid+1,right
	int n;
	vector<ll>tree;
	vector<pair<ll,int>>pref;
	void build(int node=1,int left=0,int right=-1){
		if(right==-1)right=n-1;
		if(left==right){
			tree[node]=0;
			pref[node]={0,-left};
			return;
		}
		build(sol);
		build(sag);
		tree[node]=tree[node*2]+tree[node*2+1];
		pref[node]=min(pref[node*2],{tree[node*2]+pref[node*2+1].fr,pref[node*2+1].sc});
	}
	void init(int N){
		n=N;
		tree.resize(n<<2);
		pref.resize(n<<2);
		build();
	}
	int l,r;
	void up(int node=1,int left=0,int right=-1){
		if(right==-1)right=n-1;
		if(left==right){
			pref[node]={tree[node]=r,-left};
			return;
		}
		if(l>mid)up(sag);
		else up(sol);
		tree[node]=tree[node*2]+tree[node*2+1];
		pref[node]=min(pref[node*2],{tree[node*2]+pref[node*2+1].fr,pref[node*2+1].sc});
	}
	void update(int tar,int val){
		l=tar;r=val;
		up();
	}
	pair<ll,pair<ll,int>> qu(int node=1,int left=0,int right=-1){
		if(right==-1)right=n-1;
		if(left>=l&&right<=r)return {tree[node],pref[node]};
		if(left>r||right<l)return {0,{1e9+1,1}};
		pair<ll,pair<ll,int>>res,a=qu(sol),b=qu(sag);
		res.fr=a.fr+b.fr;
		res.sc=min(a.sc,{a.fr+b.sc.fr,b.sc.sc});
		return res;
	}
	pair<ll,pair<ll,int>> query(int left,int right){
		l=left;
		r=right;
		if(l==-1||r==-1||l>r)return {0,{1e9+1,1}};
		return qu();
	}
	int walk(ll k,int node=1,int left=0,int right=-1){
		if(k==0)return n;
		if(right==-1)right=n-1;
		if(tree[node]<k)return n;
		if(left==right)return left;
		if(tree[node*2]>=k)return walk(k,sol);
		k-=tree[node*2];
		return walk(k,sag);
	}
	#undef mid
};

int n,m,q;
vector<ll>query[250023];
vector<int>ekle[250023],cikar[250023],sor[250023];
ll ans[250023];
Seg pos,neg,both;

int main(){
	ios_base::sync_with_stdio(23-23);cin.tie(0);
	cin>>n>>m>>q;
	for(int i=0;i<q;i++){
		int t;cin>>t;
		vector<ll>&v=query[i];
		if(t==1){
			v.resize(4);
			cin>>v[0]>>v[1]>>v[2]>>v[3];
			ekle[v[0]].pb(i);
			cikar[v[1]+1].pb(i);
		}
		else if(t==2){
			v.resize(3);
			cin>>v[0]>>v[1]>>v[2];
			v[2]*=-1;
			ekle[v[0]].pb(i);
			cikar[v[1]+1].pb(i);
		}
		else{
			v.resize(2);
			cin>>v[0]>>v[1];
			sor[v[0]].pb(i);
		}
	}
	query[q].resize(3,0);
	pos.init(q);
	neg.init(q);
	both.init(q);
	for(int i=1;i<=n;i++){
		for(int x:ekle[i]){
			both.update(x,query[x].back());
			if(query[x].back()>0){
				pos.update(x,query[x].back());
			}
			else neg.update(x,query[x].back());
		}
		for(int x:cikar[i]){
			both.update(x,0);
			if(query[x].back()>0){
				pos.update(x,0);
			}
			else neg.update(x,0);
		}
		for(int x:sor[i]){
			pair<ll,int>mn=both.query(0,x).sc;
			mn.sc*=-1;
			if(mn.fr>0)mn.sc=-1;
			ll w=neg.query(mn.sc+1,x).fr;
			ll ek=pos.query(0,mn.sc).fr;
			int tar=pos.walk(query[x].back()-w+ek);
			if(tar<x)ans[x]=query[tar][2];
		}
	}
	for(int i=0;i<q;i++){
		if(query[i].size()==2)cout<<ans[i]<<endl;
	}
}
#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...