```cpp
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cctype>
#include <string>
#include <cmath>
#include <climits>
using namespace std;
typedef const long double cdb;
typedef const int cint;
cint MAXN=2e5+5;
int n,tot,ans;
struct data
{
int a,b,c;
}p[MAXN];
bool visit[MAXN];
long double tmp[MAXN];
class WBLT
{
private:
struct node
{
node *lson,*rson;
long double val;int w;
node(){}
node(node* lson,node* rson,cdb val,cint w):lson(lson),rson(rson),val(val),w(w){}
}*null,*root,tr[MAXN<<1],*pool[MAXN<<1];
cint ratio=4;int cnt;
inline node* newnode(node* lson,node* rson,cdb val,cint w)
{
return &(*pool[cnt++]=node(lson,rson,val,w));
}
inline node* merge(node* u,node *v)
{
return newnode(u,v,v->val,u->w+v->w);
}
inline void pushup(node* cur)
{
if(cur->lson==null || cur->rson==null) return;
cur->val=cur->rson->val;
cur->w=cur->lson->w+cur->rson->w;
}
inline void maintain(node* cur)
{
if(cur->lson==null || cur->rson==null) return;
if(cur->lson->w>cur->rson->w*ratio)
{
cur->rson=merge(cur->lson->rson,cur->rson);
pool[--cnt]=cur->lson;
cur->lson=cur->lson->lson;
}
if(cur->rson->w>cur->lson->w*ratio)
{
cur->lson=merge(cur->lson,cur->rson->lson);
pool[--cnt]=cur->rson;
cur->rson=cur->rson->rson;
}
}
void insert(node* cur,cdb val)
{
if(cur->w==1)
{
cur->lson=newnode(null,null,min(cur->val,val),1);
cur->rson=newnode(null,null,max(cur->val,val),1);
}
else if(val<=cur->lson->val) insert(cur->lson,val);
else insert(cur->rson,val);
pushup(cur);
maintain(cur);
}
void erase(node *cur,cdb val)
{
if(cur->lson->w==1 && cur->lson->val==val)
{
pool[--cnt]=cur->lson;pool[--cnt]=cur->rson;
*cur=*cur->rson;
}
else if(cur->rson->w==1 && cur->rson->val==val)
{
pool[--cnt]=cur->rson;pool[--cnt]=cur->lson;
*cur=*cur->lson;
}
else if(val<=cur->lson->val) erase(cur->lson,val);
else erase(cur->rson,val);
pushup(cur);
maintain(cur);
}
int rank(node* cur,cdb val)
{
if(cur->w==1) return val>cur->val;
if(val<=cur->lson->val) return rank(cur->lson,val);
return cur->lson->w+rank(cur->rson,val);
}
public:
void reset(void)
{
null=new node(nullptr,nullptr,0,0);
root=new node(null,null,INT_MAX,1);
for(int i=0;i<(MAXN<<1);i++) pool[i]=&tr[i];
}
inline int size(void) {return root->w-1;}
inline void insert(cdb val) {insert(root,val);}
inline void erase(cdb val) {erase(root,val);}
inline int rank(cdb val) {return size()==0?0:rank(root,val);}
}t1,t2;
int main()
{
t1.reset();t2.reset();
cin>>n;
for(int i=1;i<=n;i++)
{
string s;cin>>s;
if(s=="Add")
{
int a,b,c;cin>>a>>b>>c;
p[++tot]=data{a,b,c};visit[tot]=true;
if(a==0 && b>c) ans++;
else if(a>0) t1.insert(tmp[tot]=(long double)(c-b)/(long double)(a));
else if(a<0) t2.insert(tmp[tot]=(long double)(c-b)/(long double)(a));
}
if(s=="Del")
{
int x;cin>>x;cint a=p[x].a,b=p[x].b,c=p[x].c;
if(!visit[x] || x>tot) continue;
visit[x]=false;
if(a==0 && b>c) ans--;
else if(a>0) t1.erase(tmp[x]);
else if(a<0) t2.erase(tmp[x]);
}
if(s=="Query")
{
int k;cin>>k;
cout<<t1.rank(k)+ans+t2.size()-t2.rank(k)<<endl;
}
}
return 0;
}
```
by LemonLime @ 2020-11-23 21:26:53
~~这马蜂太毒了吧~~
by Priori_Incantatem @ 2020-12-14 11:43:46