#include<bits/stdc++.h>
#define px first
#define py second
#define mkp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ostream_iterator<ll> output(cout," ");
const int N=100005;
//const int MOD=;
typedef pair<int,int> P;
template<typename T>
class Dynamic_SegTree{
public:
void add(int l,int r,const T& v){add(1,l,r,v);}
void add(int i,const T& v){add(1,i,i,v);}
T sum(int l,int r){return query_sum(1,l,r);}
T qmax(int l,int r){return query_max(1,l,r);}
T query(int i){return query_sum(1,i,i);}
Dynamic_SegTree(ll si){tr.emplace_back();tr.emplace_back(1,si);}
private:
void update(int i,const T& x){
tr[i].v[0]+=tr[i].len*x;
tr[i].v[1]+=x;
tr[i].tag+=x;
}
struct Node{
T v[2],tag;
ll l,r,mid,len;
int ls,rs;
Node(ll l_,ll r_){
l=l_,r=r_,mid=(l+r)>>1,len=r-l+1;
v[1]=v[0]=tag=ls=rs=0;
}
Node(){l=r=-1;v[0]=0;v[1]=numeric_limits<T>::min();tag=0;}
};
vector<Node> tr;
void create_son(int i){
if(tr[i].l==tr[i].r) return ;
if(!tr[i].ls) tr[i].ls=tr.size(),tr.emplace_back(tr[i].l,tr[i].mid);
if(!tr[i].rs) tr[i].rs=tr.size(),tr.emplace_back(tr[i].mid+1,tr[i].r);
}
void push_down(int i){
create_son(i);
if(tr[i].tag!=0){
update(tr[i].ls,tr[i].tag);
update(tr[i].rs,tr[i].tag);
tr[i].tag=0;
}
}
void push_up(int i){
tr[i].v[0]=tr[tr[i].ls].v[0]+tr[tr[i].rs].v[0];
tr[i].v[1]=max(tr[tr[i].ls].v[1],tr[tr[i].rs].v[1]);
}
void add(int i,ll l,ll r,const T& v){
if(tr[i].l>=l&&tr[i].r<=r){update(i,v);return ;}
push_down(i);
if(tr[i].mid>=l) add(tr[i].ls,l,r,v);
if(tr[i].mid<r) add(tr[i].rs,l,r,v);
push_up(i);
}
T query_sum(int i,ll l,ll r){
if(tr[i].l>=l&&tr[i].r<=r) return tr[i].v[0];
push_down(i);
T ans=0;
if(tr[i].mid>=l&&tr[i].ls) ans+=query_sum(tr[i].ls,l,r);
if(tr[i].mid<r&&tr[i].rs) ans+=query_sum(tr[i].rs,l,r);
return ans;
}
T query_max(int i,ll l,ll r){
if(tr[i].l>=l&&tr[i].r<=r) return tr[i].v[1];
push_down(i);
T ans=numeric_limits<T>::min();
if(tr[i].mid>=l&&tr[i].ls) ans=max(ans,query_max(tr[i].ls,l,r));
if(tr[i].mid<r&&tr[i].rs) ans=max(ans,query_max(tr[i].rs,l,r));
return ans;
}
};
template<typename T,typename Nest>
class NestBIT{
static int lowbit(int x){return x&(-x);}
vector<Nest> tr;
size_t n;
public:
void add(int i,int l,int r,const T& x){for(;i<=n;i+=lowbit(i)) tr[i].add(l,r,x);}
void add(int i,int j,const T& x){for(;i<=n;i+=lowbit(i)) tr[i].add(j,x);}
T presum(int i,int l,int r){T ans=0;for(;i>=1;i-=lowbit(i)) ans+=tr[i].sum(l,r);return ans;}
T presum(int i,int j){T ans=0;for(;i>=1;i-=lowbit(i)) ans+=tr[i].query(j);return ans;}
template<typename... A> NestBIT(size_t si,A&&... ags): n(si),tr(si+1,Nest(ags...)){}
template<typename... A>
T sum(int l,int r,A&&... ags){return presum(r,ags...)-presum(l-1,ags...);}
template<typename... A> T query(int i,A&&... ags){return sum(i,i,ags...);}
};
int n,k,cnt[N];
pair<int,P> b[N];
signed main(){
scanf("%d%d",&n,&k);
NestBIT<int,Dynamic_SegTree<int>> a(k,k);
for(int i=1;i<=n;i++) scanf("%d%d%d",&b[i].px,&b[i].py.px,&b[i].py.py);
sort(b+1,b+n+1);
for(int i=1,sum=1;i<=n;i++){
//cerr<<b[i].px<<" "<<b[i].py.px<<" "<<b[i].py.py<<endl;
if(b[i+1]==b[i]){
sum++;
continue;
}
a.add(b[i].py.px,b[i].py.py,sum);
/*for(int j=1;j<=k;j++)
for(int l=1;l<=k;l++)
cerr<<a.query(j,l)<<" \n"[l==k];
cerr<<a.presum(b[i].py.px,1,b[i].py.py)-1<<endl;*/
cnt[a.presum(b[i].py.px,1,b[i].py.py)-1]+=sum;
sum=1;
}
for(int i=0;i<n;i++) printf("%d\n",cnt[i]);
return 0;
}
解法为树状数组套动态开点线段树,码风诡异勿喷
record
#6TLE #7,9,10MLE