98pts卡不过去了,救救孩子吧!!!
查看原帖
98pts卡不过去了,救救孩子吧!!!
540665
Tjqq楼主2023/8/29 16:04
#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
#define pb emplace_back
#define ll long long
#define inf int(1e9)
char Ch;
int ff;
inline void rd(int &x) {
	x=0,ff=1,Ch=getchar();
	while((Ch<'0'||Ch>'9')&&Ch!='-') Ch=getchar();
	if(Ch=='-')Ch=getchar(),ff=-1;
	while(Ch>='0'&&Ch<='9') {
		x=(x<<1)+(x<<3)+Ch-'0';
		Ch=getchar();
	}
	x*=ff;
}
using namespace std;
namespace fast_IO {
#define FASTIO
#define IOSIZE 100000
	char ibuf[IOSIZE], obuf[IOSIZE];
	char *p1 = ibuf, *p2 = ibuf, *p3 = obuf;
#ifdef ONLINE_JUDGE
#define getchar() ((p1==p2)and(p2=(p1=ibuf)+fread(ibuf,1,IOSIZE,stdin),p1==p2)?(EOF):(*p1++))
#define putchar(x) ((p3==obuf+IOSIZE)&&(fwrite(obuf,p3-obuf,1,stdout),p3=obuf),*p3++=x)
#endif//fread in OJ, stdio in local
	
#define isdigit(ch) (ch>47&&ch<58)
#define isspace(ch) (ch<33)
	template<typename T> inline T read() {
		T s = 0;
		int w = 1;
		char ch;
		while (ch = getchar(), !isdigit(ch) and (ch != EOF)) if (ch == '-') w = -1;
		if (ch == EOF) return false;
		while (isdigit(ch)) s = s * 10 + ch - 48, ch = getchar();
		return s * w;
	}
	template<typename T> inline bool read(T &s) {
		s = 0;
		int w = 1;
		char ch;
		while (ch = getchar(), !isdigit(ch) and (ch != EOF)) if (ch == '-') w = -1;
		if (ch == EOF) return false;
		while (isdigit(ch)) s = s * 10 + ch - 48, ch = getchar();
		return s *= w, true;
	}
	inline bool read(char &s) {
		while (s = getchar(), isspace(s));
		return true;
	}
	inline bool read(char *s) {
		char ch;
		while (ch = getchar(), isspace(ch));
		if (ch == EOF) return false;
		while (!isspace(ch)) *s++ = ch, ch = getchar();
		*s = '\000';
		return true;
	}
	template<typename T> inline void print(T x) {
		if (x < 0) putchar('-'), x = -x;
		if (x > 9) print(x / 10);
		putchar(x % 10 + 48);
	}
	inline void print(char x) {
		putchar(x);
	}
	inline void print(char *x) {
		while (*x) putchar(*x++);
	}
	inline void print(const char *x) {
		for (register int i = 0; x[i]; i++) putchar(x[i]);
	}
#ifdef _GLIBCXX_STRING
	inline bool read(std::string& s) {
		s = "";
		char ch;
		while (ch = getchar(), isspace(ch));
		if (ch == EOF) return false;
		while (!isspace(ch)) s += ch, ch = getchar();
		return true;
	}
	inline void print(std::string x) {
		for (register int i = 0, n = x.size(); i < n; i++)
			putchar(x[i]);
	}
#endif//string
	template<typename T, typename... T1> inline int read(T& a, T1&... other) {
		return read(a) + read(other...);
	}
	template<typename T, typename... T1> inline void print(T a, T1... other) {
		print(a);
		print(other...);
	}
	
	struct Fast_IO {
		~Fast_IO() {
			fwrite(obuf, p3 - obuf, 1, stdout);
		}
	} io;
	template<typename T> Fast_IO& operator >> (Fast_IO &io, T &b) {
		return read(b), io;
	}
	template<typename T> Fast_IO& operator << (Fast_IO &io, T b) {
		return print(b), io;
	}
#define cout io
#define cin io
#define endl '\n'
}
using namespace fast_IO;
const int N=1e5+5,M=4e5+5;
int n,Q;
int a[N],t[M];
int add[M],mx[M],mn[M];
#define ls x<<1
#define rs x<<1|1
inline void push_up(register int x) {
	mn[x]=min(mn[ls],mn[rs]);
	mx[x]=max(mx[ls],mx[rs]);
}
inline void push_down(register int x) {
	if(add[x]) {
		add[ls]+=add[x];
		add[rs]+=add[x];
		mx[ls]+=add[x];
		mn[ls]+=add[x];
		mx[rs]+=add[x];
		mn[rs]+=add[x];
		add[x]=0;
	}
}
void build(register int x,register int l,register int r) {
	if(l==r) return mn[x]=mx[x]=a[l],void();
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	push_up(x);
}
int ask_max(register int x,register int l,register int r,register int L,register int R) {
//	printf("F %d %d %d\n",x,l,r);
	if(L>R) return 0;
	if(l>=L && r<=R) return mx[x];
	push_down(x);
	int mid=l+r>>1,ans=0;
	if(L<=mid) ans=ask_max(ls,l,mid,L,R);
	if(R>mid) ans=max(ans,ask_max(rs,mid+1,r,L,R));
	return ans;
}
int ask_min(register int x,register int l,register int r,register int L,register int R) {
//	printf("F %d\n",x);
	if(L>R) return inf;
	if(l>=L && r<=R) return mn[x];
	push_down(x);
	int mid=l+r>>1,ans=inf;
	if(L<=mid) ans=ask_min(ls,l,mid,L,R);
	if(R>mid) ans=min(ans,ask_min(rs,mid+1,r,L,R));
	return ans;
}
void upd(register int x,register int l,register int r,register int L,register int R) {
	if(L>R) return ;
	if(l>=L && r<=R)
		return mx[x]++,mn[x]++,add[x]++,void();
	push_down(x);
	int mid=l+r>>1;
	if(L<=mid) upd(ls,l,mid,L,R);
	if(R>mid) upd(rs,mid+1,r,L,R);
	push_up(x);
}
void modify(register int h,int c) {
	int l=1,r=n,mid,bg=n,len=0,P,L,R;
	if(mx[1]<h) return ;
	while(l<=r) {
		mid=l+r>>1;
		if(ask_max(1,1,n,mid,mid)>=h)
			bg=mid,r=mid-1;
		else l=mid+1;
	}
	P=min(n,bg+c-1),l=bg,r=P;
//	printf("! %d %d\n",bg,P);
	while(l<=r) {
		mid=l+r>>1;
		if(ask_max(1,1,n,mid,P)==ask_min(1,1,n,mid,P))
			L=mid,r=mid-1;
		else l=mid+1;
	}
//	printf("normal %d %d\n",L,L-1);
	upd(1,1,n,bg,L-1);
	int res=P-L+1;
	l=P,r=n;
	while(l<=r) {
		int mid=l+r>>1;
		if(ask_max(1,1,n,L,mid)==ask_min(1,1,n,L,mid))
			R=mid,l=mid+1;
		else r=mid-1;
	}
//	printf("%d %d %d\n",res,R-res+1,R);
	upd(1,1,n,R-res+1,R);
}
inline int query(register int x,register int y) {
	int l=1,r=n,mid,L=0,R=1e9;
	if(x>mx[1] || y<mn[1]) return 0;
	while(l<=r) {
		int mid=l+r>>1;
		if(ask_max(1,1,n,mid,mid)>=x)
			L=mid,r=mid-1;
		else l=mid+1;
	}
	l=1,r=n;
	while(l<=r) {
		int mid=l+r>>1;
		if(ask_max(1,1,n,mid,mid)<=y)
			R=mid,l=mid+1;
		else r=mid-1;
	}
//	printf("%d %d\n",L,R);
	return R-L+1;
}
char op;
signed main() { 
//	srand(time(0));
//	freopen("grow.g04G.in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>n>>Q;
	for(register int i=1; i<=n; i++)
		cin>>a[i];
	sort(a+1,a+1+n);
	build(1,1,n);
	for(register int x,y,c,h; Q--; ) {
		cin>>op;
		if(op=='F') {
			cin>>c>>h;
			modify(h,c);		
		}
		else {
			cin>>x>>y;
			printf("%d\n",query(x,y));
		}
//		puts("a");
//		for(register int i=1; i<=n; i++)
//			printf("%d ",ask_min(1,1,n,i,i));
//		puts("");
	}
	return 0;
}
/*
5 7
1 3 2 5 2
F 2 1
C 3 6
F 2 3
C 6 8
F 2 1
F 2 2
C 3 5

1 2 2 3 5
*/
2023/8/29 16:04
加载中...