#include<cstdio>
#include<iostream>
#include<map>
#include<cstring>
#include<algorithm>
#define en '\n'
using namespace std;
typedef long long ll;
template<class T>void rd(T &x)
{
x=0;int f=0;char ch=getchar();
while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return;
}
const int N=1e5+5,M=5e4+5,INF=0x3f3f3f3f;
struct node{int t,x,id;}q[N],tmp[N];
int ans[N];
map<int,int>mmp;
void cdq(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>1;
cdq(l,mid),cdq(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r){
if(q[i].t<=q[j].t){
if(q[i].id<0) mmp[q[i].x]+=(q[i].id==-1)?1:-1;
tmp[k++]=q[i++];
}
else{
if(q[j].id>0) ans[q[j].id]+=mmp[q[j].x];
tmp[k++]=q[j++];
}
}
while(i<=mid){
if(q[i].id<0) mmp[q[i].x]+=(q[i].id==-1)?1:-1;
tmp[k++]=q[i++];
}
while(j<=r){
if(q[j].id>0) ans[q[j].id]+=mmp[q[j].x];
tmp[k++]=q[j++];
}
for(int i=l;i<=mid;++i){
if(q[i].id<0) mmp[q[i].x]+=(q[i].id==-1)?-1:1;
q[i]=tmp[i];
}
for(int j=mid+1;j<=r;++j) q[j]=tmp[j];
}
int main()
{
int n,tot=0,ovo=0;rd(n);
for(int i=1;i<=n;++i){
int f,a,b;rd(f),rd(a),rd(b);
if(f==1) q[++tot]=(node){a,b,-1};
else if(f==2) q[++tot]=(node){a,b,-2};
else q[++tot]=(node){a,b,++ovo};
}
cdq(1,n);
for(int i=1;i<=ovo;++i) printf("%d\n",ans[i]);
}
CF641E Little Artem and Time Machine(cdq模板)
最新推荐文章于 2019-09-05 00:33:15 发布