20230424小记

发布时间 2023-04-25 14:55:48作者: 洛浔

闲话

今天还是体育的一天
明天就要送别可爱同桌了
呜呜呜呜呜呜呜呜呜呜呜呜
她去济南了呜呜呜呜呜呜呜呜呜呜呜呜

冰糖老婆的精神状态好像不太正常
哭唧唧

调代码需要的信息提取能力也太高了()

听中 V 调代码效率↓/cf

调了昨天的题,复习了平衡树,然后调了一年。
第二天的升旗仪式上想出来的...

// Problem: P6136【模板】普通平衡树(数据加强版)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P6136
// Memory Limit: 89 MB
// Time Limit: 3000 ms
#include<bits/stdc++.h>
using namespace std;
template<class T>void read(T &x){
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9')  {f|=(ch=='-');ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;return;
}
const int N=1e5+5,M=1e6+5;
int n,m;
namespace FHQ_Treap{
    int cnt,root;
    struct node{int l,r,val,siz,key;}a[N+M];
    int new_node(int val){
        a[++cnt]=(node){0,0,val,1,rand()};return cnt;
    }
    void pushup(int x){
        a[x].siz=a[a[x].r].siz+a[a[x].l].siz+1;
    }
    void split(int k,int x,int &l,int &r){
        if(!k) {l=r=0;return ;}
        if(a[k].val<=x){l=k;split(a[k].r,x,a[k].r,r);}
        else {r=k;split(a[k].l,x,l,a[k].l);}
        pushup(k);
    }
    int merge(int l,int r){
        if(!l||!r){
            return (l+r);
        }
        if(a[l].key<=a[r].key){
            a[l].r=merge(a[l].r,r);
            pushup(l);return l;
        }
        else {
            a[r].l=merge(l,a[r].l);
            pushup(r);return r;
        }
    }
    int kth(int x,int k){
        if(a[a[x].l].siz+1==k) return x;
        if(a[a[x].l].siz>=k) return kth(a[x].l,k);
        return kth(a[x].r,k-a[a[x].l].siz-1);
    }
}
using namespace FHQ_Treap;

int main(){
    mt19937 srand(114514111);
    read(n),read(m);
    for(int i=1;i<=n;i++){
        int t,r1,r2;
        read(t);
        split(root,t,r1,r2);
        int tmp=new_node(t);
        root=merge(merge(r1,tmp),r2);
    }
    int lastans=0,sumans=0;
    while(m--){
        int op,x;
        read(op),read(x);x^=lastans;
        if(op==1){
            int r1,r2;
            split(root,x,r1,r2);
            int tmp=new_node(x);
            root=merge(merge(r1,tmp),r2);
        }
        if(op==2){
            int r1,r2,r3;
            split(root,x,r1,r2);
            split(r1,x-1,r1,r3);
            root=merge(merge(r1,merge(a[r3].l,a[r3].r)),r2);
        }
        if(op==3){
            int r1,r2;
            split(root,x-1,r1,r2);
            lastans=a[r1].siz+1;
            sumans^=lastans;
            root=merge(r1,r2);
        }
        if(op==4){
            lastans=a[kth(root,x)].val;
            sumans^=lastans;
        }
        if(op==5){
            int r1,r2;
            split(root,x-1,r1,r2);
            lastans=a[kth(r1,a[r1].siz)].val;
            root=merge(r1,r2);
            sumans^=lastans;
        }
        if(op==6){
            int r1,r2;
            split(root,x,r1,r2);
            lastans=a[kth(r2,1)].val;
            root=merge(r1,r2);
            sumans^=lastans;
        }
    }
    cout<<sumans<<endl;
    return 0;
}