LG2075 区间 LIS

#include<bits/stdc++.h>
#define forUp(i,a,b) for(int i=(a);i<=(b);++i)
#define forUP(i,a,b) for(int i=(a);i<(b);++i)
#define forDown(i,a,b) for(int i=(a);i>=(b);--i)
#define forG(u,v) for(int __i=head[u],v=to[__i];__i;__i=nxt[__i],v=to[__i])
#define forWG(u,v,c) for(int __i=head[u],v=to[__i],c=w[__i];__i;__i=nxt[__i],v=to[__i],c=w[__i])
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define popc __builtin_popcount
#define popc64 __builtin_popcountll
#define seteps(n) fixed<<setprecision(n)
bool __mst;using int16=short;using uint16=unsigned short;using uint=unsigned int;using int64=long long;using uint64=unsigned long long;using int128=__int128;using uint128=unsigned __int128;
using float64=double;using float80=long double;constexpr int INF=0x3f3f3f3f,MINF=0xcfcfcfcf;constexpr int64 INF64=0x3f3f3f3f3f3f3f3f,MINF64=0xcfcfcfcfcfcfcfcf;constexpr float64 INFDB=1e50,eps=1e-6;
template<class _Tp>inline void chkMax(_Tp &x,const _Tp &y){x<y?x=y:x;}template<class _Tp>inline void chkMin(_Tp &x,const _Tp &y){x>y?x=y:x;}
inline int addMod(const int &x,const int &y,const int mod){int ans=x+y;return ans>=mod?ans-mod:ans;}inline int subMod(const int &x,const int &y,const int mod){int ans=x-y;return ans<0?ans+mod:ans;}
constexpr int N=1e5+10,B=317,SB=B+10,NB=(N-11)/B+11;int __test_num=1,__task_id,__tst;using namespace std;void __init();

int n,P[N],q,ans[N];vector<array<int,2>> Q[N];

int A[N],btot,blng[N],L[NB],R[NB];priority_queue<int> qmax[NB];priority_queue<int,vector<int>,greater<int>> qmin[NB];
void rebuild(int bid){
	if(!qmin[bid].empty()){
		forUp(pos,L[bid],R[bid])if(A[pos]>qmin[bid].top()){
			int Apos=exchange(A[pos],qmin[bid].top());qmin[bid].pop();
			qmin[bid].push(Apos);
		}
		priority_queue<int,vector<int>,greater<int>>().swap(qmin[bid]);
	}
	qmax[bid]=priority_queue<int>(A+L[bid],A+R[bid]+1);
}
void build(){
	L[0]=1-B,btot=(n-1)/B+1;forUp(i,1,btot){
		L[i]=L[i-1]+B,R[i]=min(R[i-1]+B,n);
		forUp(pos,L[i],R[i])blng[pos]=i;
		rebuild(i);
	}
}
int query(int l,int r,int x){
	int lb=blng[l],rb=blng[r];
	if(lb==rb){
		rebuild(lb);forUp(pos,l,r)if(A[pos]>x)swap(A[pos],x);rebuild(lb);
		return x;
	}
	else{
		rebuild(lb);forUp(pos,l,R[lb])if(A[pos]>x)swap(A[pos],x);rebuild(lb);
		forUP(bid,lb+1,rb){
			qmin[bid].push(x);
			if(qmax[bid].top()>x){
				int tx=exchange(x,qmax[bid].top());qmax[bid].pop();
				qmax[bid].push(tx);
			}
		}
		rebuild(rb);forUp(pos,L[rb],r)if(A[pos]>x)swap(A[pos],x);rebuild(rb);
		return x;
	}
}

int c[N];
void add(int pos,int val){for(++pos,pos=n+2-pos;pos<=n+1;pos+=pos&-pos)c[pos]+=val;}
int ask(int pos){int ans=0;for(++pos,pos=n+2-pos;pos;pos&=pos-1)ans+=c[pos];return ans;}

bool __med;void __solve(int __test_id){
	cin>>n>>q;
	forUp(i,1,n)cin>>P[i];
	forUp(i,1,q){
		int l,r;cin>>l>>r;
		Q[r].pushb({i,l});
	}
	build();
	forUp(i,1,n){
		int val=P[i];
		if(val<n){
			int x=query(val+1,n,0);
			add(0,1);add(x,-1);
		}
		rebuild(blng[val]);add(A[val],-1);add(A[val]=i,1);rebuild(blng[val]);
		for(auto [qid,l]:Q[i])ans[qid]=ask(l);
	}
	forUp(i,1,q)cout<<ans[i]<<'\n';
}
signed main(){
	__init();
	forUp(i,1,__test_num)__solve(i);
	cerr<<1000.0*(clock()-__tst)/CLOCKS_PER_SEC<<"ms "<<((&__mst)-(&__med))/1024.0/1024.0<<"MB"<<'\n';
	return 0;
}
void __init(){
	__tst=clock();
	#ifndef use_file
	//#define use_file
	#endif
	#ifdef use_file
	const string __file_name="test";freopen((__file_name+".in").c_str(),"r",stdin);freopen((__file_name+".out").c_str(),"w",stdout);
	#endif
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	//scanf("%d",&__test_num);
	//cin>>__task_id;
	//cin>>__test_num;
}
posted @ 2026-03-21 17:35  LXcjh4998  阅读(0)  评论(0)    收藏  举报