Submission #157188

# Submission time Handle Problem Language Result Execution time Memory
157188 2019-10-10T02:44:29 Z puppies_and_rainbows Examination (JOI19_examination) C++14
0 / 100
899 ms 1048580 KB
#include <bits/stdc++.h>
#define left dhusiad
#define right dusanan
using namespace std;

pair<int, int> a[1000005], cursort[1000005];
int it[1000005], root[1000005];
int it1[50000005], left[50000005], right[50000005];
vector<int> check[50000005];
int cntnode=0, ans, ans1;
int n;

int itgen(int l, int r)
{
	if(l>r) return 0;
	cntnode++;
	int id=cntnode;
	for(int i=l; i<=r; i++)
	{
		check[id].push_back(cursort[i].second);
	}
	it1[id]=cursort[r].first;
	sort(check[id].begin(), check[id].end());
	int mid=(l+r)/2;
	if(l==r) return id;
	left[id]=itgen(l, mid);
	right[id]=itgen(mid+1, r);
	return id;
}

void build_tree(int id, int l, int r)
{
	// cout<<"DEBUG "<<l<<" "<<r<<endl;
	for(int i=l; i<=r; i++)
	{
		cursort[i]={a[i].second, a[i].first+a[i].second};
		// cout<<cursort[i].first<<" "<<cursort[i].second<<endl;
	}
	// cout<<endl;
	sort(cursort+l, cursort+r+1);
	// for(int i=l; i<=r; i++)
	// {
	// 	cout<<cursort[i].first<<" "<<cursort[i].second<<endl;
	// }
	// cout<<endl;
	root[id]=itgen(l, r);
	if(l==r) it[id]=a[l].first;
	else
	{
		int mid=(l+r)/2;
		build_tree(id*2, l, mid);
		build_tree(id*2+1, mid+1, r);
		it[id]=max(it[id*2], it[id*2+1]);
	}
}

void solvehave(int ok, int y, int z, int l, int r)
{
	// cout<<l<<" "<<r<<" "<<ans1<<endl;
	int id=root[ok];
	while(l<r)
	{
		int mid=(l+r)/2;
		if(it1[left[id]]>=y)
		{
			ans1+=(int)(check[right[id]].end()-lower_bound(check[right[id]].begin(), check[right[id]].end(), z));
			id=left[id];
			r=mid;
		}
		else
		{
			id=right[id];
			l=mid+1;
		}
	}
	if(it1[id]>=y&&check[id][0]>=z) ans1++;
	// cout<<ans1<<endl;
}

void solvefail(int id, int z)
{
	return;
	ans+=check[root[id]].end()-lower_bound(check[root[id]].begin(), check[root[id]].end(), z);
}

bool checkk(int id, int x, int y, int z)
{
	if(a[id].first>=x&&a[id].second>=y&&a[id].first+a[id].second>=z) return true;
	return false;
}

int solve(int x, int y, int z)
{
	ans=0, ans1=0;
	int id=1, l=1, r=n;
	while(l<r)
	{
		int mid=(l+r)/2;
		if(it[id*2]>=x)
		{
			solvehave(id*2+1, y, z, mid+1, r);
			id*=2;
			r=mid;
		}
		else
		{
			solvefail(id*2, z);
			id=id*2+1;
			l=mid+1;
		}
	}
	if(checkk(l, x, y, z))
	{
		ans++;
	}
	return ans+ans1;
}

signed main()
{
	int q;
	cin>>n>>q;
	for(int i=1; i<=n; i++)
	{
		cin>>a[i].first>>a[i].second;
	}
	sort(a+1, a+n+1);
	build_tree(1, 1, n);
	// cout<<1<<endl;
	// return 0;
	int x, y, z;
	for(int i=1; i<=q; i++)
	{
		cin>>x>>y>>z;
		cout<<solve(x, y, z)<<endl;
	}
}
# Verdict Execution time Memory Grader output
1 Runtime error 899 ms 1048580 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 837 ms 1048576 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 837 ms 1048576 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 899 ms 1048580 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -