#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int N=40005;
struct SegMax{
ll T[N<<2],F[N<<2];
void Build(int x,int l,int r,ll *a){
if (l==r) return void(T[x]=a[l]);
int mid=(l+r)>>1;
Build(x<<1,l,mid,a); Build(x<<1|1,mid+1,r,a);
T[x]=max(T[x<<1],T[x<<1|1]);
}
void push(int x){
if (F[x]) T[x<<1]+=F[x],T[x<<1|1]+=F[x],F[x<<1]+=F[x],F[x<<1|1]+=F[x],F[x]=0;
}
void Add(int x,int l,int r,int ql,int qr,ll a){
if (ql<=l && r<=qr){
T[x]+=a; F[x]+=a; return;
}
push(x);
int mid=(l+r)>>1;
if (ql<=mid) Add(x<<1,l,mid,ql,qr,a);
if (qr>mid) Add(x<<1|1,mid+1,r,ql,qr,a);
T[x]=max(T[x<<1],T[x<<1|1]);
}
ll Query(int x,int l,int r,int ql,int qr){
if (ql<=l && r<=qr) return T[x];
push(x); int mid=(l+r)>>1; ll ret=-1LL<<30;
if (ql<=mid) ret=max(ret,Query(x<<1,l,mid,ql,qr));
if (qr>mid) ret=max(ret,Query(x<<1|1,mid+1,r,ql,qr));
return ret;
}
}G;
struct SegMin{
ll T[N<<2],F[N<<2];
void Build(int x,int l,int r,ll *a){
if (l==r) return void(T[x]=a[l]);
int mid=(l+r)>>1;
Build(x<<1,l,mid,a); Build(x<<1|1,mid+1,r,a);
T[x]=min(T[x<<1],T[x<<1|1]);
}
void push(int x){
if (F[x]) T[x<<1]+=F[x],T[x<<1|1]+=F[x],F[x<<1]+=F[x],F[x<<1|1]+=F[x],F[x]=0;
}
void Add(int x,int l,int r,int ql,int qr,ll a){
if (ql<=l && r<=qr){
T[x]+=a; F[x]+=a; return;
}
push(x);
int mid=(l+r)>>1;
if (ql<=mid) Add(x<<1,l,mid,ql,qr,a);
if (qr>mid) Add(x<<1|1,mid+1,r,ql,qr,a);
T[x]=min(T[x<<1],T[x<<1|1]);
}
ll Query(int x,int l,int r,int ql,int qr){
if (ql<=l && r<=qr) return T[x];
push(x); int mid=(l+r)>>1; ll ret=1LL<<60;
if (ql<=mid) ret=min(ret,Query(x<<1,l,mid,ql,qr));
if (qr>mid) ret=min(ret,Query(x<<1|1,mid+1,r,ql,qr));
return ret;
}
}F;
int n,m,a[N];
ll s[N];
int K[N];
int main(){
int x,y,z,p,l,r;
freopen("forget.in","r",stdin);
freopen("forget.out","w",stdout);
read(n); read(x); read(y); read(z); read(p);
for (int i=1;i<=n;i++)
a[i]=((ll)(i-x)*(i-x)+(ll)(i-y)*(i-y)+(ll)(i-z)*(i-z))%p,s[i]=s[i-1]+a[i];
F.Build(1,0,n,s); G.Build(1,0,n,s);
read(m); read(K[1]); read(K[2]); read(x); read(y); read(z); read(p);
for (int i=3;i<=m;i++)
K[i]=((ll)x*K[i-1]+(ll)y*K[i-2]+z)%p;
for (int i=1;i<=m;i++){
read(l); read(r);
ll fmin=F.Query(1,0,n,r,n),gmax=G.Query(1,0,n,0,l-1);
ll k=min((ll)K[i],fmin-gmax);
printf("%lld\n",k);
F.Add(1,0,n,r,n,-k);
G.Add(1,0,n,l,n,-k);
}
return 0;
}
[杂题 贪心] BZOJ 2138 stone
最新推荐文章于 2019-02-07 09:51:14 发布