| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴一个很挫的splay#include<stdio.h>
#include<string.h>
const int maxn=110000;
int ch[maxn][2],fa[maxn],num[maxn],lazy[maxn],root,key[maxn];
__int64 sum[maxn];
inline void push(int n)
{
int l=ch[n][0],r=ch[n][1];
lazy[l]+=lazy[n],lazy[r]+=lazy[n];
sum[l]+=(num[l])*(__int64)lazy[n],sum[r]+=num[r]*(__int64)lazy[n];
key[l]+=lazy[n],key[r]+=lazy[n];
lazy[n]=0;
}
inline void flow(int n)
{
num[n]=num[ch[n][0]]+num[ch[n][1]]+1;
sum[n]=sum[ch[n][0]]+sum[ch[n][1]]+key[n];
}
inline void rotate(int n)
{
int t=fa[n];
bool isr=(ch[t][1]==n);
ch[t][isr]=ch[n][!isr],fa[ch[n][!isr]]=t;
fa[n]=fa[t],ch[fa[t]][ch[fa[t]][1]==t]=n;
ch[n][!isr]=t,fa[t]=n;
flow(t),flow(n);
}
void P(int n)
{
if(fa[n])
P(fa[n]);
push(n);
}
inline void splay(int n,int goal)
{
int f,ff;
P(n);
while(fa[n]-goal)
{
f=fa[n],ff=fa[f];
if(ff==goal)
rotate(n);
else if((ch[ff][1]==f)==(ch[f][1]==n))
rotate(f),rotate(n);
else
rotate(n),rotate(n);
}
if(!goal)
root=n;
}
void ADD(int a,int b,int c)
{
splay(a-1,0);
splay(b+1,root);
push(root),push(ch[root][1]);
int t=ch[ch[root][1]][0];
lazy[t]+=c,sum[t]+=num[t]*c,key[t]+=c;
}
__int64 GET(int a,int b)
{
splay(a-1,0);
splay(b+1,root);
push(root),push(ch[root][1]);
return sum[ch[ch[root][1]][0]];
}
int main()
{
int n,i,q,a,b,c;
char s[10];
scanf("%d%d",&n,&q);
for(i=2;i<=n+1;i++)
{
scanf("%d",&key[i]);
num[i]=i,sum[i]=sum[i-1]+key[i];
ch[i][0]=i-1,fa[i-1]=i;
}
num[1]=1,num[n+2]=n+2;
sum[n+2]=sum[n+1],ch[n+2][0]=n+1,fa[n+1]=n+2;
root=n+2,fa[n+2]=0;
while(q--)
{
scanf("%s%d%d",s,&a,&b);
if(s[0]=='C')
scanf("%d",&c),ADD(a+1,b+1,c);
else
printf("%I64d\n",GET(a+1,b+1));
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator