BZOJ4864 [BeiJing 2017 Wc]神秘物质

来源:互联网 发布:脸型测试软件免费下载 编辑:程序博客网 时间:2024/05/17 08:31

傻逼题……区间最小极差一定是相邻的两个元素所构成的

然后就维护一下区间最大最小值,最小极差,splay随便搞搞就行了

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<iomanip>#include<cstring>#include<cmath>#include<ctime>#include<vector>#include<stack>#include<queue>#include<set>#include<bitset>#include<map>using namespace std;#define MAXN 200010#define MAXM 10010#define INF 1000000000#define MOD 1000000007#define ll long long#define eps 1e-8#define tr son[son[rt][1]][0]int fa[MAXN],son[MAXN][2],mn[MAXN],mx[MAXN],lv[MAXN],rv[MAXN],siz[MAXN],mnv[MAXN],v[MAXN];int rt,tot;int n,m;inline void ud(int x){    siz[x]=siz[son[x][0]]+siz[son[x][1]]+1;    mn[x]=mx[x]=lv[x]=rv[x]=v[x];    mnv[x]=INF;    if(son[x][0]){        mn[x]=min(mn[x],mn[son[x][0]]);        mx[x]=max(mx[x],mx[son[x][0]]);        mnv[x]=min(mnv[x],min(mnv[son[x][0]],abs(v[x]-rv[son[x][0]])));        lv[x]=lv[son[x][0]];    }    if(son[x][1]){        mn[x]=min(mn[x],mn[son[x][1]]);        mx[x]=max(mx[x],mx[son[x][1]]);        mnv[x]=min(mnv[x],min(mnv[son[x][1]],abs(v[x]-lv[son[x][1]])));        rv[x]=rv[son[x][1]];    }}inline void cot(int x,int y,bool z){    if(x){        fa[x]=y;    }    if(y){        son[y][z]=x;    }}inline void rot(int x,bool z){    int xx=fa[x],xxx=fa[xx];    cot(son[x][z],xx,z^1);    cot(x,xxx,son[xxx][1]==xx);    cot(xx,x,z);    ud(xx);}void splay(int x,int y){    int xx=fa[x],xxx=fa[xx];    while(xx!=y){        if(xxx==y){            rot(x,son[xx][0]==x);        }else{            bool z=son[xxx][0]==xx;            if(son[xx][z]==x){                rot(x,z^1);                rot(x,z);            }else{                rot(xx,z);                rot(x,z);            }        }        xx=fa[x],xxx=fa[xx];    }    ud(x);    if(!y){        rt=x;    }}int find(int x,int y){    if(siz[son[x][0]]+1==y){        return x;    }    if(y<=siz[son[x][0]]){        return find(son[x][0],y);    }else{        return find(son[x][1],y-siz[son[x][0]]-1);    }}inline void pick(int x,int y){    splay(find(rt,x),0);    splay(find(rt,y+2),rt);}inline void UD(){    ud(son[rt][1]);    ud(rt);}void ins(int x){    tr=++tot;    v[tr]=x;    ud(tr);    fa[tr]=son[rt][1];    UD();}int main(){    int i,x,y;    char o[10];    scanf("%d%d",&n,&m);    rt=++tot;    son[rt][1]=++tot;    fa[tot]=1;    UD();    for(i=0;i<n;i++){        scanf("%d",&x);        pick(i+1,i);        ins(x);    }    while(m--){        scanf("%s%d%d",o,&x,&y);        if(o[1]=='e'){            pick(x,x+1);            ins(y);        }        if(o[1]=='n'){            pick(x+1,x);            ins(y);        }        if(o[1]=='a'){            pick(x,y);            printf("%d\n",mx[tr]-mn[tr]);        }        if(o[1]=='i'){            pick(x,y);            printf("%d\n",mnv[tr]);        }    }    return 0;} /*4 35 8 10 2max 1 3min 1 3max 2 4 */


0 0