题目大意:一个序列,有两种操作。1.将一段数中的每个数开根号。2.查询一段数的和。

思路:和3211是一个题,有兴趣的能够看看我的那篇博客。

CODE:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 100010
using namespace std; int cnt,asks;
long long src[MAX];
long long fenwick[MAX]; int father[MAX]; void Pretreatment(); inline void Fix(int x,long long c);
inline long long GetSum(int x); int Find(int x); int main()
{
cin >> cnt;
Pretreatment();
for(int i = 1;i <= cnt; ++i) {
scanf("%lld",&src[i]);
Fix(i,src[i]);
if(src[i] == 1) father[i] = i + 1;
}
cin >> asks;
for(int flag,x,y,i = 1;i <= asks; ++i) {
scanf("%d%d%d",&flag,&x,&y);
if(x > y) swap(x,y);
if(!flag)
for(x = Find(x);x <= y;x = Find(x + 1)) {
Fix(x,-src[x]);
Fix(x,src[x] = sqrt(src[x]));
if(src[x] == 1) father[x] = Find(x + 1);
}
else printf("%lld\n",GetSum(y) - GetSum(x - 1));
}
return 0;
} void Pretreatment()
{
for(int i = 1;i <= cnt + 1; ++i)
father[i] = i;
} inline void Fix(int x,long long c)
{
for(int i = x;i <= cnt;i += i&-i)
fenwick[i] += c;
} inline long long GetSum(int x)
{
long long re = 0;
for(int i = x;i;i -= i&-i)
re += fenwick[i];
return re;
} int Find(int x)
{
if(father[x] == x) return x;
return father[x] = Find(father[x]);
}

最新文章

  1. [原创开源项目]EPUBBuilder一款在线的epub电子书编辑工具
  2. Redis 集群的合纵与连横
  3. oracle表大小
  4. tableviewCell折叠状态2
  5. 昂贵的聘礼---poj1062(最短路)
  6. 单例模式(Winform窗体的实现)
  7. cpio备份命令
  8. Codeforces 549B Looksery Party
  9. UVA 10739 String to Palindrome(dp)
  10. SQLite数据库查看工具(免费)
  11. Ajax运用总结B
  12. Mac下安装pymssql
  13. 1、roboguide新建工程文件
  14. [date] 时间问题: 更新时间距离现在3个月
  15. [Oracle]快速构造大量数据的方法
  16. JavaScript练习 - 正反选练习
  17. elasticsearch与solr区别
  18. Windows Phone开发手记-WinRT下启动器替代方案
  19. IT痴汉的工作现状42-Android越用越慢?立场不同,谈何信任!
  20. SmbException: 0xC000007F

热门文章

  1. es6 -- set 数据结构
  2. single-page关于vue-router
  3. c# 装箱与拆箱的概念
  4. bash命令集---文件的操作
  5. GDSOI2019划水记
  6. Markdown最简单常用的语法
  7. 禁止input输入空格
  8. Trafodion:Transactional SQL on HBase
  9. hdu1874 畅通project续 最短路 floyd或dijkstra或spfa
  10. actionbar-去掉背景的阴影