题目大意:
  维护一个长度为$n(n\leq100000)$的数列,支持区间加、区间求和两种操作,操作共$m(m\leq100000)$次。

思路:
  Splay区间操作。

 #include<cstdio>
#include<cctype>
typedef long long int64;
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) if(ch=='-') neg=true;
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return neg?-x:x;
}
inline char getalpha() {
register char ch;
while(!isalpha(ch=getchar()));
return ch;
}
const int N=;
class SplayTree {
private:
int par[N],ch[N][],size[N],root;
int64 val[N],sum[N],tag[N];
void push_down(const int &p) {
if(ch[p][]) {
tag[ch[p][]]+=tag[p];
val[ch[p][]]+=tag[p];
sum[ch[p][]]+=tag[p]*size[ch[p][]];
}
if(ch[p][]) {
tag[ch[p][]]+=tag[p];
val[ch[p][]]+=tag[p];
sum[ch[p][]]+=tag[p]*size[ch[p][]];
}
tag[p]=;
}
void push_up(const int &p) {
size[p]=size[ch[p][]]+size[ch[p][]]+;
sum[p]=sum[ch[p][]]+sum[ch[p][]]+val[p];
}
void rotate(const int &x) {
const int y=par[x],z=par[y];
push_down(y),push_down(x);
const int b=x==ch[y][];
par[ch[x][b]=par[ch[y][!b]=ch[x][b]]=y]=x;
par[ch[z][ch[z][]==y]=x]=z;
push_up(y),push_up(x);
}
void splay(int x,const int &goal) {
for(register int y=par[x],z=par[y];y!=goal;rotate(x),z=par[y=par[x]]) {
if(z!=goal) rotate((x==ch[y][])^(y==ch[z][])?x:y);
}
if(!goal) root=x;
}
int find(int x) {
for(register int y=root;;y=ch[y][size[ch[y][]]+<x]) {
push_down(y);
if(par[y]&&y==ch[par[y]][]) x-=size[ch[par[y]][]]+;
if(size[ch[y][]]+==x) return y;
}
}
public:
void build(const int &n) {
for(register int i=;i<=n+;i++) {
par[ch[i][]=i+]=i;
if(i&&i<=n) val[i+]=getint();
}
size[n+]=;
splay(n+,);
}
void modify(const int &l,const int &r,const int &x) {
splay(find(l),);
splay(find(r+),root);
tag[ch[ch[root][]][]]+=x;
val[ch[ch[root][]][]]+=x;
sum[ch[ch[root][]][]]+=x*size[ch[ch[root][]][]];
}
int64 query(const int &l,const int &r) {
splay(find(l),);
splay(find(r+),root);
return sum[ch[ch[root][]][]];
}
};
SplayTree t;
int main() {
const int n=getint(),m=getint();
t.build(n);
for(register int i=;i<m;i++) {
const int opt=getalpha(),l=getint(),r=getint();
if(opt=='C') t.modify(l,r,getint());
if(opt=='Q') printf("%lld\n",t.query(l,r));
}
return ;
}

最新文章

  1. JSP基本语法小结
  2. c#实现远程操作svn
  3. 【腾许Bugly干货分享】“HTTPS”安全在哪里?
  4. linux下epoll如何实现高效处理百万句柄的
  5. BZOJ4635 : 数论小测验
  6. UFS
  7. 16.Linux配置环境变量和日志history和Terminal颜色和用户(IP)操作日志记录
  8. 设置ajax 同步执行
  9. Cookie机制(会话cookie和持久化cookie)在客户端保持HTTP状态信息的方案
  10. Mtk Android编译命令
  11. cocos2d-x android java调用C++
  12. ###《More Effective C++》- 基础议题
  13. 基于duilib实现的可滑动tab标签控件
  14. 开源存储之ceph
  15. Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命
  16. Oracel 编写控制结构
  17. JS截取数字
  18. Android: 在native中访问assets全解析
  19. 事件&amp;表达式
  20. eclipse运行spark程序时日志颜色为黑色的解决办法

热门文章

  1. TCP/IP网络编程之多进程服务端(一)
  2. 创建数据收集器集(DSC)
  3. 【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)
  4. IOS开发---菜鸟学习之路--(二十二)-近期感想以及我的IOS学习之路
  5. Python 操作 PostgreSQL 数据库
  6. 菜鸟之路——git学习及GitHub的使用
  7. 文本处理grep命令
  8. [译]pandas .at 和.loc速度对比
  9. java读取文件(更新jdk7及jdk8)
  10. 解决ie8下页面刚出现时候的晃动问题