RT,BIT二分,最后一个点2sWA,求助dalao/kel
code:
#include<algorithm>
#include<cctype>
#include<cstdio>
const int M=3e6;
int n,len,lim,numa,numb,ta[M],tb[M],CA[M],CB[M],lsh[M];
struct QAQ{
int opt,t,x,y;
}p[M];
inline int read(){
int n=0;char s;
while(!isdigit(s=getchar()));
while(n=n*10+(s^48),isdigit(s=getchar()));
return n;
}
inline void Add(int*t,int x,const int&val){
for(;x<=len;x+=x&-x)t[x]+=val;
}
inline int Find(const int&lmt){
int id,tmp,ans=0,num=numb;
for(id=tmp=lim;tmp;id=ans|(tmp>>=1)){
if(num-tb[id]+CB[id]>=lmt)num-=tb[ans=id];
}
return ans;
}
inline void Solve(){
int a,b,id,la=0,lb=numb,tmp,ans=0;
for(id=tmp=lim;tmp;id=ans|(tmp>>=1)){
a=la+ta[id];b=lb-tb[id];
if(b+CB[id]>=a)la=a,lb=b,ans=id;
}
if(!la&&!lb)printf("Peace\n");
else if(la>lb)printf("%d %d\n",lsh[ans],la<<1);
else printf("%d %d\n",lsh[Find(lb)],lb<<1);
}
signed main(){
register int i;
n=read();
for(i=1;i<=n;++i){
p[i].opt=read();p[i].t=read();
if(p[i].opt==1)lsh[++len]=p[i].x=read(),p[i].y=read();
}
std::sort(lsh+1,lsh+len+1);len=std::unique(lsh+1,lsh+len+1)-lsh-1;lim=len;
while(lim^(lim&-lim))lim^=lim&-lim;
for(i=1;i<=n;++i){
if(p[i].opt==1){
p[i].x=std::lower_bound(lsh+1,lsh+len+1,p[i].x)-lsh;
if(!p[i].t)numa+=p[i].y,CA[p[i].x]+=p[i].y,Add(ta,p[i].x,p[i].y);
else numb+=p[i].y,CB[p[i].x]+=p[i].y,Add(tb,p[i].x,p[i].y);
}
else{
int id=p[i].t;
if(!p[id].t)numa-=p[id].y,CA[p[id].x]-=p[id].y,Add(ta,p[id].x,-p[id].y);
else numb-=p[id].y,CB[p[id].x]-=p[id].y,Add(tb,p[id].x,-p[id].y);
}
Solve();
}
}