金华邀请赛的题,可惜现场赛我sb了,没想出来,还是队友想的……还是要不断的练习呀,隔断时间不练习就不会了
#include <cstdlib>
#include <iostream>#include <cstdio>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=222222;
int d[4*maxn],n,k,v[maxn],sum[maxn],co[4*maxn],val[maxn];
void make(int l,int r,int rt)
{
co[rt]=0;
if(l==r)
{
if(l<k) d[rt]=-99999999;
else d[rt]=sum[r]-sum[r-k];
val[l]=d[rt];
// cout<<rt<<" "<<d[rt]<<" "<<l<<" "<<r<<endl;
return;
}
int m=(l+r)>>1;
make(lson);
make(rson);
d[rt]=max(d[rt<<1],d[rt<<1|1]);
//cout<<rt<<" "<<d[rt]<<" "<<l<<" "<<r<<endl;
}
void pushdown(int rt)
{
if(co[rt]!=0)
{
co[rt<<1]+=co[rt];
co[rt<<1|1]+=co[rt];
d[rt<<1]+=co[rt];
d[rt<<1|1]+=co[rt];
co[rt]=0;
}
}
void insert(int L,int R,int val,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
co[rt]+=val;d[rt]+=val;return;
}
pushdown(rt);
int m=(l+r)>>1;
if(L<=m) insert(L,R,val,lson);
if(R>m) insert(L,R,val,rson);
d[rt]=max(d[rt<<1],d[rt<<1|1]);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r) return d[rt];
pushdown(rt);
int m=(l+r)>>1;
int ans1=-99999999,ans2=-99999999;
if(L<=m) ans1=query(L,R,lson);
if(R>m) ans2=query(L,R,rson);
return max(ans1,ans2);
}
int main(int argc, char *argv[])
{
int ca,m,id,a,b;
scanf("%d",&ca);
while(ca--)
{
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
sum[0]=0;
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+v[i];
make(1,n,1);
// for(int i=1;i<=n;i++)
// cout<<val[i]<<" ";
cout<<endl;
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&id,&a,&b);
if(id==0) insert(a,a+k-1,b-v[a],1,n,1),v[a]=b;
else if(id==1)
{
insert(a,a+k-1,v[b]-v[a],1,n,1);
insert(b,b+k-1,v[a]-v[b],1,n,1);
int pre=v[a];
v[a]=v[b];
v[b]=pre;
}
else
printf("%d\n",query(a+k-1,b,1,n,1));
}
}
system("PAUSE");
return EXIT_SUCCESS;
}
/*
12
5 7 3
-1 2 -4 6 1
2 1 5
2 1 3
1 2 1
2 1 5
2 1 4
0 2 4
2 1 5
*/