WA on #22
查看原帖
WA on #22
926886
kind_Ygg楼主2024/10/14 15:05
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e5+5;
int ls(int x){return x*2;}
int rs(int x){return x*2+1;}
int n,q;
int a[N];
int op,x,y;
int tree[N<<2],tag[N<<2],minn[N<<2];
int now;
void build(int p,int s,int t)
{
	if(s==t)
	{
		tree[p]=a[s];
		minn[p]=a[s];
		return;
	}
	int mid=s+(t-s>>1);
	build(ls(p),s,mid);
	build(rs(p),mid+1,t);
	tree[p]=tree[ls(p)]+tree[rs(p)];
	minn[p]=min(minn[ls(p)],minn[rs(p)]);
}
void push_down(int p,int s,int t)
{
	if(tag[p]!=-1)
	{
		int mid=s+(t-s>>1);
		tree[ls(p)]=tag[p]*(mid-s+1);
		tree[rs(p)]=tag[p]*(t-mid);
		tag[ls(p)]=tag[p];
		tag[rs(p)]=tag[p];
		minn[ls(p)]=tag[p];
		minn[rs(p)]=tag[p];
		tag[p]=-1;
	}
	return;
}
void update(int l,int r,int k,int s,int t,int p)
{
	if(l<=s and t<=r)
	{
		tree[p]=k*(t-s+1);
		tag[p]=k;
		return;
	}
	int mid=s+((t-s)>>1);
	push_down(p,s,t);
	if(l<=mid) update(l,r,k,s,mid,ls(p));
	if(mid+1<=r) update(l,r,k,mid+1,t,rs(p));
	tree[p]=tree[ls(p)]+tree[rs(p)];
}
int find(int l,int r,int k,int s,int t,int p)
{
	if(s==t)
	{
		if(minn[p]<=k) return s;
		return n+1;
	}
	int mid=s+(t-s>>1);
	push_down(p,s,t);
	if(minn[ls(p)]<=k and l<=mid) return find(l,r,k,s,mid,ls(p));
	return find(l,r,k,mid+1,t,rs(p));
	
}
int query(int l,int r,int s,int t,int p)
{
	if(now>=tree[p] and l<=s and t<=r)
	{
		now-=tree[p];
		return t-s+1;
	}
	if(s==t) return 0;
	int mid=s+((t-s)>>1);
	push_down(p,s,t);
	int ans=0;
	if(l<=mid and now>=minn[ls(p)]) ans+=query(l,r,s,mid,ls(p));
	if(mid+1<=r and now>=minn[rs(p)]) ans+=query(l,r,mid+1,t,rs(p));
	return ans;
}
signed main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	memset(tag,-1,sizeof tag);
	build(1,1,n);
	while(q--)
	{
		cin>>op>>x>>y;
		if(op==1)
		{
			int qp=find(1,x,y,1,n,1);
			if(qp!=n+1) update(qp,x,y,1,n,1);
		}
		else
		{
			now=y;
			cout<<query(x,n,1,n,1)<<'\n';
		}
	}
	return 0;
}
2024/10/14 15:05
加载中...