比赛 20140307 评测结果 AAAAAAAAAAA
题目名称 最优挤奶法 最终得分 100
用户昵称 bigmingod 运行时间 0.544 s
代码语言 C++ 内存使用 15.55 MiB
提交时间 2014-03-07 20:32:50
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#define LL long long
#define zxc 200000
using namespace std;
LL n,m,d[zxc],l[zxc],r[zxc],left[zxc],right[zxc],sumleft[zxc],sumright[zxc],all[zxc],pos[zxc],f[zxc],ans,r1,r2;

LL max(LL x,LL y)
{ return x<y?y:x;}

void pushup(LL x)
{
	d[x]=max(d[left[x]]+sumright[right[x]],d[right[x]]+sumleft[left[x]]);
	sumright[x]=max(sumright[left[x]]+sumright[right[x]],all[left[x]]+d[right[x]]);
	sumleft[x]=max(sumleft[left[x]]+sumleft[right[x]],d[left[x]]+all[right[x]]);
	all[x]=max(sumright[left[x]]+all[right[x]],sumleft[right[x]]+all[left[x]]);
}

void change(LL x,LL y)
{
	d[x]=y;
	for(x=f[x];x;x=f[x]) pushup(x);
}

int main()
{
	freopen("optmilk.in","r",stdin);
	freopen("optmilk.out","w",stdout);
	LL i,ll=0,rr=1,mid;
	scanf("%lld%lld",&n,&m);
	l[1]=1; r[1]=n;
	while(ll!=rr)
	{
		ll++; if(l[ll]==r[ll]) pos[l[ll]]=ll; else
		{
			mid=(l[ll]+r[ll])/2;
			l[++rr]=l[ll]; r[rr]=mid; left[ll]=rr; f[rr]=ll;
			l[++rr]=mid+1; r[rr]=r[ll]; right[ll]=rr; f[rr]=ll;
		}
	}
	for(i=1;i<=n;i++) {scanf("%lld",&r1); change(pos[i],r1);}
	for(i=1;i<=m;i++)
	{
		scanf("%lld%lld",&r1,&r2);
		change(pos[r1],r2);
		ans+=d[1];
	}
	printf("%lld",ans);
	return 0;
}