老师给的代码 1 和 l 根本分不清,原来错的代码越调越离谱,输出都没有
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,m,ans[N];
struct node2
{
int x,y,c,type,id;
}q[N],q1[N],q2[N];
struct node
{
int l,r,f,sum;
}t[4*N];
void update(int node)
{
t[node].sum=t[node*2].sum+t[node*2+1].sum;
}
void build(int node,int L,int R)
{
t[node].l=L;
t[node].r=R;
if(L==R){t[node].sum=0;return;}
int mid=L+R>>1;
build(node*2,L,mid);
build(node*2+1,mid+1,R);
update(node);
}
void down(int node)
{
int left_node=node*2;
int right_node=node*2+1;
if(t[node].f)
{
t[left_node].f+=t[node].f;
t[left_node].sum+=(t[left_node].r-t[left_node].l+1)*t[node].f;
t[right_node].f+=t[node].f;
t[right_node].sum+=(t[right_node].r-t[right_node].l+1)*t[node].f;
t[node].f=0;
}
}
void add(int node,int L,int R,int x)
{
int l=t[node].l;
int r=t[node].r;
int mid=l+r>>1;
if(l>=L&&r<=R)
{
t[node].f+=x;
t[node].sum+=(r-l+1)*x;
return;
}
if(l>R||r<L)return;
down(node);
if(L<=mid)add(node*2,L,R,x);
if(R>mid)add(node*2+1,L,R,x);
update(node);
}
int qur(int node,int L,int R)
{
int l=t[node].l;
int r=t[node].r;
int mid=l+r>>1;
if(l>=L&&r<=R)return t[node].sum;
if(l>R||r<L)return 0;
int temp;
down(node);
if(L<=mid)temp+=qur(node*2,L,R);
if(R>mid)temp+qur(node*2+1,L,R);
return temp;
}
void solve(int l,int r,int ql,int qr)
{
if(l>r||ql>qr)return;
int mid=l+r+l>>1;
if(l==r)
{
for(int i=ql; i<=qr; i++)
if(q[i].type==2)ans[q[i].id]=1;
return;
}
int ct1=0,ct2=0;
for(int i=ql; i<=qr; i++)
{
if(q[i].type==l)
{
if(q[i].c>=mid)
{
q2[++ct2]=q[i];
add(l,q[i].x,q[i].y,1);
}
else q1[++ct1]=q[i];
}
else
{
int temp=qur(1,q[i].x,q[i].y);
if(q[i].c<=temp)q2[++ct2]=q[i];
else q[i].c-=temp,q1[++ct1]=q[i];
}
}
for(int i=1; i<=ct2; i++)
if(q2[i].type==1)add(1,q2[i].x,q2[i].y,-1);
for(int i=1; i<=ct1; i++)
q[ql+i-1]=q1[i];
for(int i=1; i<=ct2; i++)
q[ql+ct1+i-1]=q2[i];
solve(l,mid-l,ql,ql+ct1-1);
solve(mid,r,ql+ct1,qr);
return;
}
signed main(){
cin>>n>>m;
build(1,1,n);
int temp=0;
for(int i=1; i<=m; i++)
{
int op,x,y,z;
cin>>op>>x>>y>>z;
if(op==1)q[i]={x,y,z,op,-1};
else q[i]={x,y,z,op,++temp};
}
solve(-n,m,1,m);
for(int i=1; i<=temp; i++)
cout<<ans[i]<<endl;
return 0;
}