版权声明:蒟蒻Blog随意转载 https://blog.csdn.net/a1799342217/article/details/82988589
线段树
set卡了老半天都没卡过去,只好老实写线段树了。8.6s卡过。
代码:
#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000005
#define F inline
using namespace std;
struct tree{ int l,r,mx,mn,x; }t[N<<2];
int n,m,now;
F char readc(){
static char buf[100000],*l=buf,*r=buf;
if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
return l==r?EOF:*l++;
}
F int _read(){
int x=0; char ch=readc();
while (!isdigit(ch)) ch=readc();
while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=readc();
return x;
}
void build(int x,int l,int r){
t[x].l=l,t[x].r=r,t[x].mn=1e9;
if (l==r) return; int mid=l+r>>1;
build(x<<1,l,mid),build(x<<1|1,mid+1,r);
}
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
F void pshp(int x){
t[x].mx=max(t[x<<1].mx,t[x<<1|1].mx);
t[x].mn=min(t[x<<1].mn,t[x<<1|1].mn);
t[x].x=t[x<<1].x+t[x<<1|1].x;
}
void mdfy(int x,int p,int w){
if (t[x].l==t[x].r){
if (t[x].x==w) return; now+=w-t[x].x;
if (!w) t[x].mx=0,t[x].mn=1e9,t[x].x=0;
else t[x].mx=t[x].mn=t[x].l,t[x].x=1; return;
}
int mid=t[x].l+t[x].r>>1; mdfy(x<<1|(p>mid),p,w),pshp(x);
}
int find(int x,int p){
if (!p||!t[x].x) return -1;
if (t[x].l==t[x].r) return t[x].x*2-1;
return find(x<<1|(p>(t[x].l+t[x].r>>1)),p);
}
int frnt(int x,int p){
if (!t[x].x||t[x].l>p) return 0; int k;
if (t[x].l==t[x].r) return t[x].l;
return (k=frnt(x<<1|1,p))?k:frnt(x<<1,p);
}
int bck(int x,int p){
if (!t[x].x||t[x].r<p) return 0; int k;
if (t[x].l==t[x].r) return t[x].l;
return (k=bck(x<<1,p))?k:bck(x<<1|1,p);
}
int main(){
n=_read(),m=_read(),build(1,1,n);
while (m--){
int f=_read(),x; if (f!=3&&f!=4) x=_read()+1;
switch (f){
case 1: mdfy(1,x,1); break;
case 2: mdfy(1,x,0); break;
case 3: now?printf("%d\n",t[1].mn-1):puts("-1"); break;
case 4: now?printf("%d\n",t[1].mx-1):puts("-1"); break;
case 5: printf("%d\n",frnt(1,x-1)-1); break;
case 6: printf("%d\n",bck(1,x+1)-1); break;
case 7: printf("%d\n",find(1,x)); break;
}
}
return 0;
}