记录编号 142380 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]stone 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.478 s
提交时间 2014-12-08 10:54:33 内存使用 4.74 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define sqr(x) ((x)*(x))
const int SIZEN=40010,INF=0x7fffffff/2;
class NODE{
public:
	int a,b;
	int lc,rc;
	int mn;
	int lazy;
	#define a(x) Tree[x].a
	#define b(x) Tree[x].b
	#define lc(x) Tree[x].lc
	#define rc(x) Tree[x].rc
	#define mn(x) Tree[x].mn
	#define lazy(x) Tree[x].lazy
}Tree[SIZEN*4];
int tot=0;
void pushdown(int x){
	if(!x||!lc(x)) return;
	mn(lc(x))+=lazy(x);lazy(lc(x))+=lazy(x);
	mn(rc(x))+=lazy(x);lazy(rc(x))+=lazy(x);
	lazy(x)=0;
}
void update(int x){
	if(!x||!lc(x)) return;
	mn(x)=min(mn(lc(x)),mn(rc(x)));
}
int build(int l,int r,int s[]){
	int p=++tot;
	a(p)=l;b(p)=r;lazy(p)=0;
	if(l==r){
		lc(p)=rc(p)=0;
		mn(p)=s[l];
	}
	else{
		int mid=(l+r)/2;
		lc(p)=build(l,mid,s);
		rc(p)=build(mid+1,r,s);
		update(p);
	}
	return p;
}
int query(int x,int l,int r){
	if(!x||a(x)>r||b(x)<l) return INF;
	pushdown(x);
	if(a(x)>=l&&b(x)<=r) return mn(x);
	else return min(query(lc(x),l,r),query(rc(x),l,r));
}
void change(int x,int l,int r,int t){//[l,r]区间加t
	if(!x||a(x)>r||b(x)<l) return;
	pushdown(x);
	if(a(x)>=l&&b(x)<=r){
		mn(x)+=t;
		lazy(x)+=t;
	}
	else{
		change(lc(x),l,r,t);
		change(rc(x),l,r,t);
		update(x);
	}
}
int N,M;
int A[SIZEN]={0};
int S[SIZEN]={0};
int K[SIZEN]={0};
int L[SIZEN],R[SIZEN];
int f_Root,g_Root;
//f[i]=S[i]-TR[i],g[i]=TL[i]-S[i]
//需要对任意j>i都有f[j]+g[i]>=0
void work(void){
	f_Root=build(0,N,S);
	for(int i=1;i<=N;i++) S[i]*=-1;
	g_Root=build(0,N,S);
	for(int i=1;i<=M;i++){
		/*
		假设这次是x~y,选的石头数量为t
		那么TR[y]~TR[N]+=t,f[y]~f[N]-=t
		同时TL[x]~TL[N]+=t,g[x]~g[N]+=t
		对于x'<x<=y<=y'的(x',y'),(f[y']+g[x'])-=t
		对于x<=x'<=y'<=y的(x',y'),(f[y']+g[x'])+=t,但never mind
		*/
		int now=query(f_Root,R[i],N)+query(g_Root,0,L[i]-1);
		now=min(now,K[i]);
		printf("%d\n",now);
		change(f_Root,R[i],N,-now);
		change(g_Root,L[i],N,now);
	}
}
void read(void){
	scanf("%d",&N);
	int x,y,z,P;
	scanf("%d%d%d%d",&x,&y,&z,&P);
	for(int i=1;i<=N;i++){
		A[i]=sqr(i-x)%P;
		A[i]+=sqr(i-y)%P;A[i]%=P;
		A[i]+=sqr(i-z)%P;A[i]%=P;
		S[i]=S[i-1]+A[i];
	}
	scanf("%d",&M);
	scanf("%d%d%d%d%d%d",&K[1],&K[2],&x,&y,&z,&P);
	for(int i=3;i<=M;i++){
		K[i]=(x*K[i-1])%P;
		K[i]+=(y*K[i-2])%P;K[i]%=P;
		K[i]+=z%P;K[i]%=P;
	}
	for(int i=1;i<=M;i++) scanf("%d%d",&L[i],&R[i]);
}
int main(){
	freopen("nt2011_stone.in","r",stdin);
	freopen("nt2011_stone.out","w",stdout);
	read();
	work();
	return 0;
}