제출 #1339775

#제출 시각아이디문제언어결과실행 시간메모리
1339775hxanoExamination (JOI19_examination)C++20
100 / 100
577 ms218324 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define ll long long
#define ii pair<ll,ll>
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define lwb lower_bound
#define upb upper_bound
#define ld double
#define ins insert
#define del erase
#define ull unsigned long long
using namespace std;
const ll big=1e5+9;
const ll sml=1e3+9;
const ll inf=1e18;
const ll mod=1e9+7;
const ld pi=3.1415926535109793L;
const ld eps=1e-12L;
struct tr{ll fi,se,th; tr(ll _fi=0, ll _se=0, ll _th=0){fi=_fi; se=_se; th=_th;}};
struct qu{ll fi,se,th,fo; qu(ll _fi=0, ll _se=0, ll _th=0, ll _fo=0){fi=_fi; se=_se; th=_th; fo=_fo;}};
ll mxz(ll &t, ll val){if (t<val){t=val; return 1;} return 0;}
ll mnz(ll &t, ll val){if (t>val){t=val; return 1;} return 0;}
ld mxz(ld &t, ld val){if (t<val){t=val; return 1;} return 0;}
ld mnz(ld &t, ld val){if (t>val){t=val; return 1;} return 0;}
ll qpw(ll n, ll k, ll m=mod){ll p=1, t=n%m; while (k){if (k&1) p=p*t%m; t=t*t%m; k>>=1;} return p;}
ll ran(){
	ll s=0;
	for (ll i=0; i<2; ++i) s^=(ll)rand()<<(i*14ll);
	return abs(s);
}
ll ran(ll l, ll r){
	return ran()%(r-l+1)+l;
}
ld ranl(ld l, ld r){
	return ran(l*1e6,r*1e6)*1e-6;
}
ll n,m,q,k;
struct custom_map {
	ll sz=0;
	vector<ii> val;
	ll init(ll _sz){
		sz=_sz*1.6+ran(0,1000);
		val.resize(sz,ii(-1,0));
		return 0;
	}
	ll upd(ll p){
		ll i=((p+big)+p/2ll)*37ll%sz;
		while (val[i].fi!=-1){
			if (val[i].fi==p){
				++val[i].se;
				return 0;
			}
			++i;
			if (i==sz) i=0;
		}
		val[i].fi=p;
		val[i].se=1;
		return 0;
	}
	ll get(ll p){
		ll i=((p+big)+p/2ll)*37ll%sz;
		while (val[i].fi!=-1){
			if (val[i].fi==p){
				return val[i].se;
			}
			++i;
			if (i==sz) i=0;
		}
		return 0;
	}
} fw_tri;
vector<ll> comx, comy;
ll szx, szy;
ll add(ll x, ll y){
	++x; ++y;
	for (; x; x-=x&-x){ll z=y; for (; z; z-=z&-z) fw_tri.upd(x*(szy+3)+z);}
	return 0;
}
ll get(ll x, ll y){
	ll s=0;
	++x; ++y;
	for (; x<=szx; x+=x&-x){ll z=y; for (; z<=szy; z+=z&-z) s+=fw_tri.get(x*(szy+3)+z);}
	return s;
}
vector<qu> que;
ll ans[big];
ll solve(){
	cin>>n>>q;
	for (ll i=1; i<=n; ++i){
		ll x,y; cin>>x>>y;
		que.eb(x+y,0,x,y);
	}
	for (ll i=1; i<=q; ++i){
		ll x,y,z; cin>>x>>y>>z;
		que.eb(z,i,x,y);
		comx.eb(x);
		comy.eb(y);
	}
	sort(que.begin(),que.end(),[](const qu &x, const qu &y){
		if (x.fi!=y.fi) return x.fi>y.fi;
		if (x.se!=y.se) return x.se<y.se;
		if (x.th!=y.th) return x.th<y.th;
		return x.fo<y.fo;
	});
	sort(comx.begin(),comx.end());
	comx.erase(unique(comx.begin(),comx.end()),comx.end());
	sort(comy.begin(),comy.end());
	comy.erase(unique(comy.begin(),comy.end()),comy.end());
	szx=(ll)comx.size();
	szy=(ll)comy.size();
	fw_tri.init(n*log2(n)*log2(n)*0.3);
	for (const qu &t: que){
		ll x=(upb(comx.begin(),comx.end(),t.th)-comx.begin()-1);
		ll y=(upb(comy.begin(),comy.end(),t.fo)-comy.begin()-1);
		if (t.se==0){
			add(x,y);
		} else {
			ans[t.se]=get(x,y);
		}
	}
	for (ll i=1; i<=q; ++i){
		cout<<ans[i]<<"\n";
	}
	return 0;
}
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	freopen("INPUT.TXT","r",stdin);
//	freopen("OUTPUT.TXT","w",stdout);
	srand(time(0));
//	cout<<fixed<<setprecision(4);
	ll tst=1;
//	cin>>tst;
	for (; tst; --tst) solve();
	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...