rt。使用的是OIwiki上的写法,即线段树维护区间中点处最大线段的编号
#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N=1e5+5,M=5e4;
const db inf=1e9;
int n,tot;
char opt[15];
struct segment{
db a,b;
}seg[N];
db calc(int i,int x){
if(i==0) return -inf;
return seg[i].a+seg[i].b*(x-1);
}
struct SGT{
#define ls (k<<1)
#define rs (k<<1|1)
struct node{
int l,r,val;
}t[M*4+5];
void build(int k,int l,int r){
t[k].l=l,t[k].r=r,t[k].val=0;
if(l==r) return;
int mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
}
void insert(int k,int x){
int mid=(t[k].l+t[k].r)>>1;
if(calc(t[k].val,mid)<calc(x,mid)) swap(t[k].val,x);
if(t[k].l==t[k].r) return;
if(calc(t[k].val,t[k].l)<calc(x,t[k].l)) insert(ls,x);
if(calc(t[k].val,t[k].r)<calc(x,t[k].r)) insert(ls,x);
}
db query(int k,int pos){
int mid=(t[k].l+t[k].r)>>1;db res=calc(t[k].val,pos);
if(t[k].l==t[k].r) return res;
if(pos<=mid) res=max(res,query(ls,pos));
else res=max(res,query(rs,pos));
return res;
}
#undef ls
#undef rs
}sgt;
int main(){
scanf("%d",&n);
int x;
db a,b,ans;
sgt.build(1,1,M);
for(int i=1;i<=n;i++){
scanf("%s",opt);
if(opt[0]=='Q'){
scanf("%d",&x);
ans=sgt.query(1,x);
if(ans<=0) printf("0\n");
else printf("%d\n",int(ans/100));
}
else{
scanf("%lf%lf",&a,&b);
seg[++tot]=(segment){a,b};
sgt.insert(1,tot);
}
}
return 0;
}