1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| #include <bits/stdc++.h> #define MAXN 200005 using namespace std; inline int read(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int rt[MAXN*150]; namespace FHQTreap{ struct node{ int l,r; int val,pri,sz; }tree[MAXN*150]; int tot; #define lc(i) tree[i].l #define rc(i) tree[i].r inline void Update(const int &x){ tree[x].sz=tree[lc(x)].sz+tree[rc(x)].sz+1; } inline int New(int v){ tree[++tot].val=v; tree[tot].pri=rand(); tree[tot].sz=1; return tot; } #define Rson rc(x),y #define Lson x,lc(y) int Merge(int x,int y){ if (!x||!y) return x+y; if (tree[x].pri<tree[y].pri){ rc(x)=Merge(Rson),Update(x); return x; } else { lc(y)=Merge(Lson),Update(y); return y; } } void Split(int i,int k,int &x,int &y){ if (!i){ x=y=0; } else { if (tree[i].val<=k) x=i,Split(rc(i),k,Rson); else y=i,Split(lc(i),k,Lson); Update(i); } } inline void Insert(int &rt,int val,int num){ for (register int i=1;i<=num;++i){ int x=0,y=0; Split(rt,val,x,y); rt=Merge(Merge(x,New(val)),y); } } inline int GetRank(int rt,int val){ int x=0,y=0; Split(rt,val,x,y); int ans=tree[x].sz; rt=Merge(x,y); return ans; } } using namespace FHQTreap; struct Flower{ int a,b,c; }f[MAXN]; inline bool operator < (const Flower &A,const Flower &B){ if (A.a!=B.a) return A.a<B.a; else if (A.b!=B.b) return A.b<B.b; return A.c<B.c; } #define lowbit(x) x&(-x) int k; inline void upd(int x,int y,int val){ for (register int i=x;i<=k;i+=lowbit(i)){ Insert(rt[i],y,val); } } inline int qry(int x,int y){ int ans=0; for (register int i=x;i>0;i-=lowbit(i)){ ans+=GetRank(rt[i],y); } return ans; } int Ans[MAXN]; int main(){ int n=read();k=read(); for (register int i=1;i<=n;++i){ f[i].a=read(),f[i].b=read(),f[i].c=read(); } sort(f+1,f+1+n); int same=1; for (register int i=1;i<=n;++i){ if (f[i+1].a==f[i].a&&f[i+1].b==f[i].b&&f[i+1].c==f[i].c){ same++; } else { upd(f[i].b,f[i].c,same); Ans[qry(f[i].b,f[i].c)]+=same; same=1; } } for (register int i=1;i<=n;++i){ printf("%d\n",Ans[i]); } }
|