/************************************************************** Problem: 1568 User: syh0313 Language: C++ Result: Accepted Time:560 ms Memory:7544 kb ****************************************************************/ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <cmath> #include <algorithm> #define lch a[n].lc #define rch a[n].rc using namespace std; const int maxn=100010; const double eps=1e-8; double b[maxn],k[maxn],ans; int n,t,root,topt,xx,now; struct da{ int lc,rc,id;}a[4*maxn]; char s[20]; void build_tree( int &n, int l, int r) { n=++topt; a[n].id=0; if (l==r) return ; int mid=(l+r)>>1; build_tree(lch,l,mid); build_tree(rch,mid+1,r); } double yz( double x, int kk) { return x*k[kk]+b[kk];} void tree_add( int n, int L, int R, int l, int r, int k) { int mid=(L+R)>>1; if (L==l && R==r) { if (!a[n].id) {a[n].id=k; return ;} if (yz(l,k)>=yz(l,a[n].id) && yz(r,k)>=yz(r,a[n].id)) {a[n].id=k; return ;} if (yz(l,k)<=yz(l,a[n].id) && yz(r,k)<=yz(r,a[n].id)) return ; if (yz(( double )(l+r)/2.0,a[n].id)<=yz(( double )(l+r)/2.0,k)) { if (yz(l,k)>=yz(l,a[n].id)) tree_add(rch,mid+1,R,mid+1,r,a[n].id); else tree_add(lch,L,mid,l,mid,a[n].id); a[n].id=k; } else { if (yz(l,k)>=yz(l,a[n].id)) tree_add(lch,L,mid,l,mid,k); else tree_add(rch,mid+1,R,mid+1,r,k); } return ; } if (r<=mid) tree_add(lch,L,mid,l,r,k); else if (l>=mid+1) tree_add(rch,mid+1,R,l,r,k); else tree_add(lch,L,mid,l,mid,k),tree_add(rch,mid+1,R,mid+1,r,k); } void qury( int n, int l, int r, int lc) { if (a[n].id) ans=max(ans,k[a[n].id]*lc+b[a[n].id]); if (l==r) return ; int mid=(l+r)>>1; if (lc<=mid) qury(lch,l,mid,lc); else qury(rch,mid+1,r,lc); } int main() { scanf ( "%d" ,&n); t=50000; build_tree(root,1,t); for ( int i=1;i<=n;i++) { scanf ( "%s" ,s+1); if (s[1]== 'P' ) { scanf ( "%lf%lf" ,&b[i],&k[i]); b[i]-=k[i]; tree_add(root,1,t,1,t,i); } else { scanf ( "%d" ,&xx); ans=0; qury(root,1,t,xx); printf ( "%lld\n" ,( long long )ans/100ll); } } return 0; } |