Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long ll;
- const ll N = 300500;
- ll n,v[N],ans[N],u[N];
- ll b[N],sz;
- void init(){memset(b,0,sizeof(ll)*(sz+1));}
- void add(int p,ll d){for(;p<=sz;p+=p&-p) b[p]+=d;}
- ll qry(int p){ll res=0;for(;p;p-=p&-p) res+=b[p]; return res;}
- struct Query{
- int type, x, y, ans;
- } Q[N];
- inline bool LESS(int a,int b){return Q[a].x!=Q[b].x ? Q[a].x<Q[b].x : a<b;}
- inline void merges(int l,int m,int r){
- vector<int> tmp;
- int i = l, j = m;
- while(i<m || j<r){
- if((j==r) || (i<m && LESS(v[i],v[j]))) {
- auto &q = Q[v[i]];
- if(q.type == 1) add(q.y,1);
- tmp.push_back(v[i++]);
- }else{
- auto &q = Q[v[j]];
- if(q.type != 1) q.ans += qry(q.y);
- tmp.push_back(v[j++]);
- }
- }
- for(int i = l; i < m; i++) if(Q[v[i]].type == 1) add(Q[v[i]].y,-1);
- for(int i = l; i < r; i++) v[i] = tmp[i-l];
- }
- void CDQ(int l,int r){
- if(l+1 == r) return;
- int mid = l+(r-l>>1);
- CDQ(l,mid),CDQ(mid,r);
- merges(l,mid,r);
- }
- signed main(){
- ios_base::sync_with_stdio(0),cin.tie(0);
- cin >> n;
- for(int i = 0; i < n; i++) cin >> Q[i].type >> Q[i].x >> Q[i].y;
- for(int i = 0; i < n; i++) u[sz++] = Q[i].y;
- sort(u,u+sz), sz=unique(u,u+sz)-u;
- for(int i = 0; i < n; i++) Q[i].y = lower_bound(u,u+sz,Q[i].y)-u+1;
- init();
- iota(v,v+n,0);
- CDQ(0,n);
- for(int i = 0; i < n; i++) Q[i].x = -Q[i].x, Q[i].y = sz+1-Q[i].y;
- iota(v,v+n,0);
- CDQ(0,n);
- for(int i = 0; i < n; i++) if(Q[i].type != 1) cout << Q[i].ans << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment