D1T3

#include<bits/stdc++.h>
using namespace std;
const int N=500005;
struct node{
	int pos,val,id;
	bool operator <(const node &x)const{return x.pos>pos;}
};
struct data{int l,r,pos;}q[N];
int n,m,a[N],ans[N],x,vis[N],p[N],c[N],l,r;
double f[N],g[N];
std::vector<node> que;
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
inline double cal(int u,int v)
{return a[u]+sqrt(abs(v-u))-a[v];}
inline int find(data b,int u)
{
	int ll=b.l,rr=b.r;
	while(ll<=rr)
	{
		int mid=(ll+rr)>>1;
		if(cal(b.pos,mid)>cal(u,mid))ll=mid+1;
		else rr=mid-1;
	}
	return ll;
}
inline void rev()
{for(int i=1;i<=n/2;i++)swap(a[i],a[n-i+1]);}
inline void solve(double *b)
{
	int head=1,tail=0;
	for(int i=1;i<=n;i++)
	{
		q[head].l++;
		if(head<=tail&&q[head].r<q[head].l)head++;
		if(head>tail||cal(i,n)>cal(q[tail].pos,n))
		{
			while(head<=tail&&cal(q[tail].pos,q[tail].l)<cal(i,q[tail].l))
				tail--;
			if(head>tail)q[++tail]=data{i,n,i};
			else
			{
				int ee=find(q[tail],i);
				q[tail].r=ee-1;
				q[++tail]=data{ee,n,i};
			}
		}
		b[i]=cal(q[head].pos,i);
	}
}
inline int lowbit(int now){return (now&(-now));}
inline void modify(int pos,int val)
{for(int i=pos;i<=n;i+=lowbit(i))c[i]+=val;}
inline int query(int pos)
{
	int gg=0;
	for(int i=pos;i>=1;i-=lowbit(i))gg+=c[i];
	return gg;
}
int main(int argc, char const *argv[])
{
	freopen("fight.in","r",stdin);
	freopen("fight.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	solve(f);rev();solve(g);
	for(int i=1;i<=n;i++)p[i]=max(0,(int)ceil(max(f[i],g[n-i+1])));
	for(int i=1;i<=m;i++)
	{
		x=read();l=read();r=read();
		que.push_back(node{l-1,p[x]/2,i});
		que.push_back(node{r,p[x]/2,i});
	}
	sort(que.begin(),que.end());
	int cur=1;
	for(int i=0;i<que.size();i++)
	{
		if(i)for(int j=que[i-1].pos+1;j<=que[i].pos;j++)
		modify(p[j],1);
		else for(int j=1;j<=que[i].pos;j++)modify(p[j],1);
		if(!vis[que[i].id])
		{ans[que[i].id]-=query(que[i].val);vis[que[i].id]=true;}
		else ans[que[i].id]+=query(que[i].val);
	}
	for(int i=1;i<=m;i++)printf("%d
",ans[i]);
	return 0;
}
原文地址:https://www.cnblogs.com/Ace-MYX/p/11306324.html