Submission #1325338

#TimeUsernameProblemLanguageResultExecution timeMemory
1325338boclobanchat푸드 코트 (JOI21_foodcourt)C++20
100 / 100
278 ms42460 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=252525;
int getlog(long long n) { return 63-__builtin_clzll(n); }
struct fenwicktree
{
	long long fen[MAXN];
	void update(int i,int n,long long val) { for(;i<=n;i+=i&-i) fen[i]+=val; }
	long long get(int i) { long long ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; }
	int walk(int n,long long val) { int ans=0;for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];return ans+1; }
};
struct node
{
	long long pref,mn,pos;
};
struct query
{
	long long t,idx,val;
};
node merge(node a,node b)
{
	node c;
	c.pref=a.pref+b.pref;
	if(a.mn<a.pref+b.mn) c.mn=a.mn,c.pos=a.pos;
	else c.mn=a.pref+b.mn,c.pos=b.pos;
	return c;
}
node seg[MAXN*4];
fenwicktree fa,fb;
int A[MAXN];
bool ck[MAXN];
long long ans[MAXN];
vector<query> vq[MAXN];
void build(int l,int r,int pos)
{
	if(l==r)
	{
		seg[pos]={0,0,l};
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,pos*2);
	build(mid+1,r,pos*2+1);
	seg[pos]=merge(seg[pos*2],seg[pos*2+1]);
}
void update(int l,int r,int i,long long val,int pos)
{
	if(i<l||r<i) return ;
	if(l==r)
	{
		seg[pos].pref+=val,seg[pos].mn+=val;
		return ;
	}
	int mid=(l+r)/2;
	update(l,mid,i,val,pos*2);
	update(mid+1,r,i,val,pos*2+1);
	seg[pos]=merge(seg[pos*2],seg[pos*2+1]);
}
node get(int l,int r,int u,int v,int pos)
{
	if(u<=l&&r<=v) return seg[pos];
	int mid=(l+r)/2;
	if(v<=mid) return get(l,mid,u,v,pos*2);
	if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
	return merge(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1));
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m,q;
	cin>>n>>m>>q;
	for(int i=1;i<=q;i++)
	{
		int t;
		cin>>t;
		if(t==1)
		{
			int l,r,c,k;
			cin>>l>>r>>c>>k;
			vq[l].push_back({1,i,k});
			vq[r+1].push_back({1,i,-k});
			A[i]=c;
		}
		else if(t==2)
		{
			int l,r,k;
			cin>>l>>r>>k;
			vq[l].push_back({2,i,-k});
			vq[r+1].push_back({2,i,k});
		}
		else
		{
			long long p,k;
			cin>>p>>k;
			vq[p].push_back({3,i,k});
			ck[i]=true;
		}
	}
	build(0,q,1);
	for(int i=1;i<=n;i++)
	{
		for(auto v:vq[i]) if(v.t==1)
		{
			update(0,q,v.idx,v.val,1);
			fa.update(v.idx,q,v.val);
		}
		else if(v.t==2)
		{
			update(0,q,v.idx,v.val,1);
			fb.update(v.idx,q,v.val);
		}
		else
		{
			int pos=get(0,q,0,v.idx,1).pos;
			int p=fa.walk(q,v.val-fb.get(v.idx)+fb.get(pos)+fa.get(pos));
			if(p<=v.idx) ans[v.idx]=A[p];
			else ans[v.idx]=0;
		}
	}
	for(int i=1;i<=q;i++) if(ck[i]) cout<<ans[i]<<"\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...