shishan 代码球条
TLE on #36 #37 #38
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read() {
int x=0; char c=0; while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c&15),c=getchar();
return x;
}
int n,m,k,op[201000],x[201000],res[201000];
struct node{
int l,r,sum,lval,rval,ok;
}mp[801000];
int b[201000];
void pushup(int op){
mp[op].lval=(mp[op<<1].lval?mp[op<<1].lval:mp[op<<1|1].lval);
mp[op].rval=(mp[op<<1|1].rval?mp[op<<1|1].rval:mp[op<<1].rval);
mp[op].ok=mp[op<<1].ok&&mp[op<<1|1].ok&&(!mp[op<<1].sum||!mp[op<<1|1].sum||mp[op<<1|1].lval-mp[op<<1].lval<=k);
mp[op].sum=mp[op<<1].sum+mp[op<<1|1].sum;
}
void build(int op,int l,int r){
mp[op].l=l,mp[op].r=r,mp[op].ok=1;
if(l==r)
return ;
int mid=mp[op].l+mp[op].r>>1;
build(op<<1,l,mid);
build(op<<1|1,mid+1,r);
pushup(op);
}
void change(int op,int x,int val){
if(mp[op].l==mp[op].r){
if(!mp[op].sum){
mp[op].lval=mp[op].rval=val;
mp[op].sum=1;
}
else
mp[op].lval=mp[op].rval=mp[op].sum=0;
return ;
}
int mid=mp[op].l+mp[op].r>>1;
if(x<=mid)
change(op<<1,x,val);
else change(op<<1|1,x,val);
pushup(op);
}
node ask(int op,int x){
if(mp[op].ok)
return mp[op];
int mid=mp[op].l+mp[op].r>>1;
node ans;
if(x<=mid){
ans=ask(op<<1,x);
if(mp[op<<1|1].sum&&mp[op<<1|1].lval-ans.rval<=k){
node rson=ask(op<<1|1,x);
ans.sum+=rson.sum;
ans.rval=rson.rval;
}
}
else{
ans=ask(op<<1|1,x);
if(mp[op<<1].sum&&ans.lval-mp[op<<1].rval<=k){
node lson=ask(op<<1,x);
ans.sum+=lson.sum;
ans.lval=lson.lval;
}
}
return ans;
}
signed main(){
n=read(),k=read();
for(int i=1;i<=n;i++){
op[i]=read();
b[i]=x[i]=read();
}
sort(b+1,b+n+1);
m=unique(b+1,b+n+1)-b-1;
build(1,1,m);
for(int i=1;i<=n;i++)
res[i]=lower_bound(b+1,b+m+1,x[i])-b;
for(int i=1;i<=n;i++)
if(op[i]==1)
change(1,res[i],x[i]);
else
cout<<ask(1,res[i]).sum<<"\n";
return 0;
}