萌新求条
查看原帖
萌新求条
701478
_FastFT2013楼主2024/7/16 09:08
#include<iostream>
#define low(x) (x&(-x))
using namespace std;
const int N=2e5+5;
int n,m;
struct que{
	int id,l,r,v,op;
	que(const int &I=0,const int &L=0,const int &R=0,const int &V=0,const int &O=0){
		id=I,l=L,r=R,v=V,op=O;
	}
}a[N<<1],a1[N<<1],a2[N<<1];
int tot,ans[N],dn;
int c[N<<1];
void add(int x,int k){
	for(;x<=n;x+=low(x))c[x]+=k;
}
int query(int x){
	int sum=0;
	for(;x;x-=low(x))sum+=c[x];
	return sum;
}
void clear(int x){
	for(;x<=n;x+=low(x))c[x]=0;
}
void cdq(int l,int r,int L,int R){
	if(L>R)return;
	if(l==r){
		for(int i=L;i<=R;i++){
			if(a[i].op)ans[a[i].id]=l;
		}
		return;
	}
	int mid=(l+r)>>1,sum1=0,sum2=0;
	for(int i=L;i<=R;i++){
		if(a[i].op){
			int sum=query(a[i].r)-query(a[i].l-1);
			if(a[i].v<=sum){
				a1[++sum1]=a[i];
			}else{
				a2[++sum2]=a[i];
				a2[sum2].v-=sum;
			}
		}else{
			if(a[i].v<=mid){
				a1[++sum1]=a[i];
				if(a[i].id==0)continue;
				add(a[i].id,1);
			}else{
				a1[++sum2]=a[i];
				
			}
		}
	}
	for(int i=1;i<=sum1;i++){
		a[i+L-1]=a1[i];
	}
	for(int i=1;i<=sum2;i++){
		a[L+sum1+i-1]=a2[i];
	}
	for(int i=1;i<=sum1;i++){
		clear(a1[i].id);
	}
	cdq(l,mid,L,L+sum1-1),cdq(mid+1,r,L+sum1,R);
}
int main(){
	cin>>n>>m;
	int minn=1e9,maxx=0;
	for(int i=1;i<=n;i++){
		int z;
		cin>>z;
		a[++tot]=que(i,0,0,z,0);
		minn=min(minn,z);
		maxx=max(maxx,z);
	}
	while(m--){
		dn++;
		int l,r,k;
		cin>>l>>r>>k;
		a[++tot]=que(dn,l,r,k,1);
	}
	cdq(minn,maxx,1,tot);
	for(int i=1;i<=dn;i++){
		cout<<ans[i]<<"\n";
	}
	return 0;
}
2024/7/16 09:08
加载中...