比赛 |
数列操作练习题 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
数列操作e |
最终得分 |
100 |
用户昵称 |
_Itachi |
运行时间 |
2.463 s |
代码语言 |
C++ |
内存使用 |
14.79 MiB |
提交时间 |
2017-03-18 19:06:21 |
显示代码纯文本
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char cc;inline void R_int(int &x){
while(cc=getchar(),cc<'!');x=cc-48;
while(cc=getchar(),cc>'!')x=x*10+cc-48;
}
#define LL unsigned long long
const int maxn=100005;
int RT,cnt=0,mid[maxn<<1],s,t,ls[maxn<<1],rs[maxn<<1];
LL s0[maxn<<1],s1[maxn<<1],s2[maxn<<1],g1[maxn],g2[maxn],q1,q2,q0;
LL v[maxn<<1],lz0[maxn<<1],lz1[maxn<<1],lz2[maxn<<1];
int Build(int l,int r){
int rt=++cnt;s0[rt]=r-l+1;
if(l==r){
s1[rt]=l,s2[rt]=l*1ull*l;return rt;
}
mid[rt]=(l+r)>>1;
ls[rt]=Build(l,mid[rt]),rs[rt]=Build(mid[rt]+1,r);
s1[rt]=s1[ls[rt]]+s1[rs[rt]];
s2[rt]=s2[ls[rt]]+s2[rs[rt]];
return rt;
}
void Add(int rt,int l,int r){
if(s<=l&&r<=t){
lz0[rt]+=q0,lz1[rt]+=q1,lz2[rt]+=q2;
v[rt]+=q0*s0[rt]+q1*s1[rt]+q2*s2[rt];
return;
}
if(s<=mid[rt])Add(ls[rt],l,mid[rt]);
if(t> mid[rt])Add(rs[rt],mid[rt]+1,r);
v[rt]=v[ls[rt]]+v[rs[rt]]+lz0[rt]*s0[rt]+lz1[rt]*s1[rt]+lz2[rt]*s2[rt];
}
LL Get(int rt,int l,int r){
if(s<=l&&r<=t)return v[rt];
int ll=max(l,s)-1,rr=min(r,t);
LL res=lz0[rt]*(rr-ll)+lz1[rt]*(g1[rr]-g1[ll])+lz2[rt]*(g2[rr]-g2[ll]);
if(s<=mid[rt])res+=Get(ls[rt],l,mid[rt]);
if(t> mid[rt])res+=Get(rs[rt],mid[rt]+1,r);
return res;
}
int main(){
freopen("rneaty.in","r",stdin);freopen("rneaty.out","w",stdout);
int n,m,o,x;LL ans=0;R_int(n),R_int(m);
RT=Build(1,n);
for(int i=1;i<=n;i++)g1[i]=g1[i-1]+i,g2[i]=g2[i-1]+i*1ull*i;
while(m--){
R_int(o),R_int(s),R_int(t);
if(o==1)s--,R_int(x),q2=x,q1=-2ull*s*x,q0=s*1ull*s*x,s++,Add(RT,1,n);
//printf("%llu\n",Get(RT,1,n));
else ans^=Get(RT,1,n);
}
printf("%llu\n",ans);
fclose(stdin);fclose(stdout);return 0;
}