Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- #define double long double
- #define Task "NCREC"
- #define READFILE freopen(Task".inp", "r", stdin)
- #define WRITEFILE freopen(Task".out", "w", stdout)
- #define double long double
- #define oo 0x3f3f3f3f3f
- #define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
- #define mp make_pair
- #define pb push_back
- #define X first
- #define Y second
- #define watch(x) cout << (#x) << " = " << x << endl
- #define debug(x) cout << (#x) << " = " << x << endl
- #define all(x) x.begin(), x.end()
- #define sz(x) x.size()
- #define endl '\n'
- #define max3(a,b,c) max(max(a, b), c)
- #define max4(a,b,c,d) max(max(a, b), max(c, d))
- #define min4(a,b,c,d) min(min(a, b), min(c, d))
- #define debug4(a,b,c,d) watch(a);watch(b);watch(c);watch(d)
- #define ever (;true;)
- #define maxn 505
- #define PI 3.14159265
- using namespace std;
- typedef pair < int, int > ii;
- typedef pair < int, ii > iii;
- typedef pair < ii, ii > iiii;
- typedef vector < int > vi;
- typedef vector < ii > vii;
- typedef vector < vi > vvi;
- typedef vector < iii > viii;
- typedef vector < vii > vvii;
- typedef vector < iiii > viiii;
- typedef vector < vvi > vvvi;
- const int N = 1e5 + 5;
- struct DT{
- int x, y1, y2, Type, id;
- bool operator < (const DT &a){
- if (x != a.x) return x < a.x;
- if (Type == a.Type){
- if (y1 == a.y1) return y2 < a.y2;
- return y1 > a.y1;
- }
- return Type < a.Type;
- }
- };
- vector < DT > SL;
- int n, m;
- struct RECT{
- int x, y, u, v;
- friend istream &operator >> (istream &stream, RECT &a){
- cin >> a.x >> a.y >> a.u >> a.v;
- return stream;
- }
- }r[N];
- struct POINT{
- int x, y, k;
- friend istream &operator >> (istream &stream, POINT &a){
- cin >> a.x >> a.y >> a.k;
- return stream;
- }
- }p[N];
- int st[8 * N];
- int lazy[8 * N];
- void down(int id){
- if (lazy[id] == 0) return;
- st[id << 1] = lazy[id];
- st[id << 1 | 1] = lazy[id];
- lazy[id << 1] = lazy[id];
- lazy[id << 1 | 1] = lazy[id];
- lazy[id] = 0;
- }
- void update(int u, int v, int w, int id = 1, int l = 0, int r = m + 2*n){
- if (l > r || u > v || u > r || l > v) return;
- if (u <= l && r <= v){
- st[id] = w;
- lazy[id] = w;
- return;
- }
- down(id);
- int mid = (l + r) >> 1;
- update(u, v, w, id << 1, l, mid);
- update(u, v, w, id << 1 | 1, mid + 1, r);
- }
- int Get(int pos, int id = 1, int l = 0, int r = m + 2*n){
- if (l > r || pos < l || pos > r) return 0;
- if (l == r) return st[id];
- int mid = (l + r) >> 1;
- down(id);
- if (pos <= mid) return Get(pos, id << 1, l, mid);
- return Get(pos, id << 1 | 1, mid + 1, r);
- }
- set < int > mySet[N];
- int res[N];
- int pre[N];
- void init(){
- FAST;
- #ifndef ONLINE_JUDGE
- READFILE;
- WRITEFILE;
- #endif // ONLINE_JUDGE
- }
- void enter(){
- cin >> n >> m;
- vi val;
- for (int i = 1; i <= n; ++i){
- cin >> r[i];
- val.pb(r[i].y);
- val.pb(r[i].v);
- }
- for (int i = 1; i <= m; ++i){
- cin >> p[i];
- val.pb(p[i].y);
- }
- sort(all(val));
- val.erase(unique(all(val)), val.end());
- for (int i = 1; i <= n; ++i){
- r[i].y = lower_bound(all(val), r[i].y) - val.begin();
- r[i].v = lower_bound(all(val), r[i].v) - val.begin();
- SL.pb({r[i].x, r[i].y, r[i].v, -1, i});
- SL.pb({r[i].u, r[i].y, r[i].v, 1, i});
- }
- for (int i = 1; i <= m; ++i){
- p[i].y = lower_bound(all(val), p[i].y) - val.begin();
- SL.pb({p[i].x, p[i].y, p[i].y, 0, p[i].k});
- }
- }
- void Solve(){
- sort(all(SL));
- for (int i = 0; i < (int)SL.size(); ++i){
- if (SL[i].Type == 0){
- int Pos = Get(SL[i].y1);
- if (Pos) mySet[Pos].insert(SL[i].id);
- }
- else if (SL[i].Type == -1){
- int Pos = Get(SL[i].y1);
- pre[SL[i].id] = Pos;
- update(SL[i].y1, SL[i].y2, SL[i].id);
- }
- else{
- res[SL[i].id] = mySet[SL[i].id].size();
- int u = pre[SL[i].id];
- if (u){
- int v = SL[i].id;
- if (mySet[u].size() < mySet[v].size()) swap(mySet[u], mySet[v]);
- for (int T : mySet[v]) mySet[u].insert(T);
- }
- update(SL[i].y1, SL[i].y2, u);
- }
- }
- }
- void xuat(){
- for (int i = 1; i <= n; ++i) cout << res[i] << endl;
- }
- signed main(){
- init();
- enter();
- Solve();
- xuat();
- return 0;
- }
Add Comment
Please, Sign In to add comment