全部评论 3

  • #include<bits/stdc++.h>
    using namespace std;
    const int N=5e5;
    #define x first
    #define y second
    #define pii pair<int,int>
    int n,m,q,idlim;
    int idh(int x,int y){ return x*(m+2)+y; }
    pii hdi(int id){ return pii(id/(m+2),id%(m+2)); }
    int idv(int x,int y){ return y*(n+2)+x; }
    pii vdi(int id){ return pii(id%(n+2),id/(n+2)); }
    template<class T>
    struct array2d{
    T a[N];
    int n,m;
    void init(int val=0){
    memset(a,val,sizeof(a));
    }
    void set_size(int n,int m,int val=0){
    this->n=n;
    this->m=m;
    init(val);
    }
    T* operator[](int i){
    return a+i*(m+2);
    }
    const T* operator[](int i)const{
    return a+i*(m+2);
    }
    T& operator[](pii p){
    return a[p.x*(m+2)+p.y];
    }
    const T& operator[](pii p)const{
    return a[p.x*(m+2)+p.y];
    }
    };
    array2d<int> v,h,col,lv,tim;
    vector<pii> piece;

    struct node{
    int ch[2],sz;
    };
    node t[N*30];int cnt;
    void pushup(int x){
    t[x].sz=t[t[x].ch[0]].sz+t[t[x].ch[1]].sz;
    }
    void insert(int p,int &x,int l,int r){
    if(!x)x=++cnt;
    if(lr){ t[x].sz=1;return; }
    int mid=(l+r)>>1;
    if(p<=mid)insert(p,t[x].ch[0],l,mid);
    else insert(p,t[x].ch[1],mid+1,r);
    pushup(x);
    }
    void erase(int p,int &x,int l,int r){
    if(!x)return;
    if(l
    r){ t[x].sz=0;return; }
    int mid=(l+r)>>1;
    if(p<=mid)erase(p,t[x].ch[0],l,mid);
    else erase(p,t[x].ch[1],mid+1,r);
    pushup(x);
    }
    int merge(int x,int y){
    if(!(x&&y))return x+y;
    t[x].ch[0]=merge(t[x].ch[0],t[y].ch[0]);
    t[x].ch[1]=merge(t[x].ch[1],t[y].ch[1]);
    if(t[x].ch[0]||t[x].ch[1])pushup(x);
    else t[x].sz|=t[y].sz;
    return x;
    }
    int query_rk(int v,int x,int l,int r){
    if(!t[x].sz)return 0;
    if(lr)return t[x].sz;
    int mid=(l+r)>>1;
    if(v<=mid)return query_rk(v,t[x].ch[0],l,mid);
    else return t[t[x].ch[0]].sz+query_rk(v,t[x].ch[1],mid+1,r);
    }
    bool exist(int v,int x,int l,int r){
    if(!t[x].sz)return 0;
    if(l
    r)return 1;
    int mid=(l+r)>>1;
    if(v<=mid)return exist(v,t[x].ch[0],l,mid);
    else return exist(v,t[x].ch[1],mid+1,r);
    }

    struct DSU_with_lr{
    int l[N],r[N],f[N];
    int (int x){ return f[x]==x?x:f[x]=(f[x]); }
    void merge(in

    2天前 来自 浙江

    0
  • 1周前 来自 重庆

    0
  • nb

    2026-03-19 来自 浙江

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页