分块炸了
查看原帖
分块炸了
365338
sogk楼主2021/7/22 17:48

忽略丑陋的快读快写

#include <bits/stdc++.h>
#define AK 1
#define ll long long

namespace FastIOstream{
	template <typename T> 
	inline void read(T &x){//Fast read
		x=0;
		int f=1;
		char c=getchar();
		for(;!isdigit(c);){
			if(c=='-')
				f=-1;
			c=getchar();
		}
		for(;isdigit(c);){
			x=(x<<1)+(x<<3)+c-48;
			c=getchar();
		}
		x*=f;
		return;
	}
	template <typename T> 
	void print(T x){//Fast print
		if(x<0){
			x=-x;
			putchar('-');
		}
		if(x>9){
			print((x>>1)/5);
		}
		putchar(x%10+48);
		return;
	}
}

using namespace std;
using namespace FastIOstream;

ll n,t,a[1000005],d[1005],p[100005],l[1005],r[1005],s[1000005],w,num;

inline void init(){
	scanf("%lld%lld",&n,&t);
	for(int i=1;i<=n;++i){
		scanf("%lld",&a[i]);
		s[i]=a[i];
	}
	w=sqrt(n);
	num=n/w;
	for(int i=1;i<=num;++i){
		l[i]=(i-1)*w+1;
		r[i]=i*w;
	}
	if(num*w<n){
		++num;
		l[num]=(num-1)*w+1;
		r[num]=n;
	}
	for(int i=1;i<=num;++i){
		for(int j=l[i];j<=r[i];++j){
			p[j]=i;
			sort(s+l[i],s+r[i]+1);
		}
	}
	return;
}

inline void Plus(int x,int y,int k){
	if(p[x]==p[y]){
		int q=p[x];
		for(int i=x;i<=y;++i){
			a[i]+=k;
		}
		for(int i=l[q];i<=r[q];++i){
			s[i]=a[i];
		}
		sort(s+l[q],s+r[q]+1);
	}
	else{
		int qr=p[x]+1,qf=p[y]-1;
		for(int i=qr;i<=qf;++i){
			d[i]+=k;
		}
		qr=x;qf=r[p[x]];
		for(int i=qr;i<=qf;++i){
			a[i]+=k;
		}
		for(int i=l[p[x]];i<=r[p[x]];++i){
			s[i]=a[i];
		}
		sort(s+l[p[x]],s+r[p[x]]+1);
		qr=l[p[y]];qf=y;
		for(int i=qr;i<=qf;++i){
			a[i]+=k;
		}
		for(int i=l[p[y]];i<=r[p[y]];++i){
			s[i]=a[i];
		}
		sort(s+l[p[y]],s+r[p[y]]+1);
	}
	return;
}

inline ll cut(ll x,ll y,ll c){
	for(;x<y;){
		ll mid=(x+y)>>1;
		if(s[mid]+d[p[x]]>=c)y=mid;
		else x=mid+1;
	}
	return y;
}

inline int ask(int x,int y,int c){
	if(p[x]==p[y]){
		int ans=0;
		int q=p[x];
		for(int i=l[q];i<=r[q];++i){
			if(a[i]+d[q]>=c)ans++;
		}
		return ans;
	}
	else{
		int ans=0;
		int qr=p[x]+1,qf=p[y]-1;
		for(int i=qr;i<=qf;++i){
			int k=c;
			ans+=(r[i]-cut(l[i],r[i],k)+1);
		}
		qr=x,qf=r[p[x]];
		for(int i=qr;i<=qf;++i){
			if((a[i]+d[p[x]])>=c)ans++;
		}
		qr=l[p[y]],qf=y;
		for(int i=qr;i<=qf;++i){
			if((a[i]+d[p[y]])>=c)ans++;
		}
		return ans;
	}
}

signed main(){
	init();
	for(int i=1;i<=t;i++){
		char op;
		int x,y,k;
		cin >> op;
		read(x);
		read(y);
		read(k);
		if(op=='M'){
			Plus(x,y,k);
		}
		else if(op=='A'){
			print(ask(x,y,k));
			puts(" ");
		}
	}
	return 0;
}
2021/7/22 17:48
加载中...