#include<bits/stdc++.h>
using namespace std;
#define ii pair<int,int>
#define fi first
#define se second
struct query { int t,i,pos,p; };
bool sortq(query a,query b) { if(a.pos==b.pos) return a.t<b.t;return a.pos<b.pos; }
const int MAXN=5e5+5;
const int mod=30013;
int val[MAXN],A[MAXN][4];
query Q[MAXN*2];
ii fen[MAXN],num[MAXN];
ii merge(ii a,ii b)
{
	if(a.fi<b.fi) return b;
	if(a.fi>b.fi) return a;
	return {a.fi,(a.se+b.se)%mod};
}
void update(int i,ii val) { for(;i<MAXN;i+=i&-i) fen[i]=merge(fen[i],val); }
ii get(int i) { ii ans={0,1};for(;i;i-=i&-i) ans=merge(ans,fen[i]);return ans; }
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,k;
	cin>>k;
	int cnt=0,cv=0;
	for(int i=1;i<=k;i++)
	{
		int l,r,u,v;
		cin>>l>>r>>u>>v;
		val[++cv]=l,val[++cv]=r,val[++cv]=u,val[++cv]=v;
		A[i][0]=l,A[i][1]=r,A[i][2]=u,A[i][3]=v;
	}
	sort(val+1,val+cv+1);
	for(int i=1;i<=k;i++)
	{
		int l=lower_bound(val+1,val+cv+1,A[i][0])-val;
		int r=lower_bound(val+1,val+cv+1,A[i][1])-val;
		int u=lower_bound(val+1,val+cv+1,A[i][2])-val;
		int v=lower_bound(val+1,val+cv+1,A[i][3])-val;
		Q[++cnt]={2,l-1,u-1,i};
		Q[++cnt]={1,r,v,i};
	}
	stack<ii> st;
	sort(Q+1,Q+cnt+1,sortq);
	num[0]={0,1};
	for(int i=1;i<=cnt;i++)
	{
		if(Q[i].t==1) st.push({Q[i].i,Q[i].p});
		else
		{
			ii res=get(Q[i].i);
			num[Q[i].p]={res.fi+1,res.se};
		}
		if(Q[i+1].t!=1)
		{
			while(!st.empty())
			{
				int a=st.top().fi,b=st.top().se;
				st.pop();
				update(a,num[b]);
			}
		}
	}
	cout<<get(cv).fi<<" "<<get(cv).se;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |