动态开点线段树的空间复杂度不是 O(mlogn) 吗?数组空间开到 N<<6 为什么还不够啊
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
char x=getchar();
int ans=0,f=1;
while(x<'0'||x>'9')
{
if(x=='-')
f=-1;
x=getchar();
}
while(x>='0'&&x<='9') ans=(ans<<3)+(ans<<1)+x-'0',x=getchar();
return ans*f;
}
const int N=1e5+10;
struct Trends_Segment_Tree
{
struct node
{
int lt,rt;
int v;
int tag1,tag2;
}a[N<<6];
int cnt,root;
void init()
{
cnt=root=1;
}
void addtag(int &x,int l,int r,int fa)
{
if(!x)
x=++cnt;
if(a[fa].tag2)
{
a[x].v=(r-l+1)-a[x].v;
a[x].tag2^=1;
if(a[x].tag1)
a[x].tag1=(a[x].tag1==1?-1:1);
}
if(a[fa].tag1)
{
a[x].v=(r-l+1)*(a[fa].tag1==1);
a[x].tag1=a[fa].tag1;
}
}
void pushup(int x)
{
a[x].v=a[a[x].lt].v+a[a[x].rt].v;
}
void pushdown(int x,int l,int r)
{
if(l>=r)
return ;
int mid=(l+r)>>1;
addtag(a[x].lt,l,mid,x);
addtag(a[x].rt,mid+1,r,x);
a[x].tag1=a[x].tag2=0;
}
void turn(int x,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
if(a[x].tag1)
a[x].tag1=(a[x].tag1==1?-1:1);
a[x].tag2^=1;
a[x].v=(r-l+1)-a[x].v;
}
else
{
pushdown(x,l,r);
int mid=(l+r)>>1;
if(L<=mid)
turn(a[x].lt,l,mid,L,R);
if(mid+1<=R)
turn(a[x].rt,mid+1,r,L,R);
pushup(x);
}
}
void change(int x,int l,int r,int L,int R,int v)
{
if(L<=l&&r<=R)
{
a[x].tag1=v;
a[x].v=(r-l+1)*(v==1);
}
else
{
pushdown(x,l,r);
int mid=(l+r)>>1;
if(L<=mid)
change(a[x].lt,l,mid,L,R,v);
if(mid+1<=R)
change(a[x].rt,mid+1,r,L,R,v);
pushup(x);
}
}
int find(int x,int l,int r)
{
if(l==r)
{
if(a[x].v==0)
return l;
else
return 1000000000000000001;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(a[a[x].lt].v<(mid-l+1))
return find(a[x].lt,l,mid);
else
return find(a[x].rt,mid+1,r);
}
}T;
signed main()
{
T.init();
int n=read();
for(int i=1;i<=n;i++)
{
int op=read(),l=read(),r=read();
if(op==1)
T.change(T.root,1,1000000000000000000,l,r,1);
else if(op==2)
T.change(T.root,1,1000000000000000000,l,r,-1);
else
T.turn(T.root,1,1000000000000000000,l,r);
printf("%lld\n",T.find(T.root,1,1000000000000000000));
}
return 0;
}