时间限制:1秒 空间限制:131072K

题目描述

考虑维护一个这样的问题:
(1) 给出一个数组A,标号为1~n
(2) 修改数组中的一个位置。
(3) 询问区间[l,r]中所有子集的位运算and之和mod(109+7)。
位运算and即为“pascal中的and”和“C/C++中的&”
我们定义集合S={ l , l+1 , ... , r-1 , r}
若集合T,T ∩ S = T,则称T为S的子集
设f(T)=AT1 and AT2 and ... and ATk  (设k为T集大小,若k=0则f(T)=0) 
所有子集的位运算and之和即为∑f(T)
那么,现在问题来了。

输入描述:

第一行,一个正整数N
第二行,N个非负整数,为数组A
第三行,一个正整数M,为操作次数
接下来M行格式如下
修改操作: 1 x y,将Ax修改为y
询问操作: 2 l r,区间[l,r]中所有子集的位运算and之和 mod(109+7)

输出描述:

对于每次询问输出一行,为该次询问的答案mod(109+7)。
long long 请使用lld
示例1

输入

3
1 2 3
6
2 1 3
1 1 2
2 1 3
2 2 3
1 2 5
2 1 3

输出

9
15
7
13

对于二进制下每一位,我们单独算其在区间内的贡献,最后加起来就是查询答案。
我们对二进制下每一位(最多31位)都建一个树状数组bit[i],保存二进制下第i位为1的数字个数的前缀和。然后修改和增加这个无需赘言,修改要先把修改位置对应二进制下的1从bit中删掉再增加新的数字的bit。查询则是:若对应区间[i,j]在二进制下第k位有p个数字,那么贡献为(2p-1)*2k。每一位的贡献加起来就是答案。

 #include<bits/stdc++.h>
#define clr(x) memset(x,0,sizeof(x))
#define clr_1(x) memset(x,-1,sizeof(x))
#define LL long long
#define mod 1000000007
using namespace std;
const int N=1e5+;
const int M=1e9+;
int num[N];
int bit[][N];
int n,m,k,u,v,op,t;
LL ans;
LL quick_pow(LL x,int n)
{
LL res=;
while(n)
{
if(n&) res=(res*x)%mod;
x=(x*x)%mod;
n>>=;
}
return res;
}
void add(int i,int x,int pos)
{
while(i<=n)
{
bit[pos][i]+=x;
i+=i&-i;
}
return ;
}
int sum(int i,int pos)
{
int s=;
while(i>)
{
s+=bit[pos][i];
i-=i&-i;
}
return s;
}
int main()
{
scanf("%d",&n);
clr(bit);
for(int i=;i<=n;i++)
{
scanf("%d",&num[i]);
k=;
t=num[i];
while(t)
{
if(t&) add(i,,k);
t>>=;
k++;
}
}
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&op,&u,&v);
if(op==)
{
k=;
t=num[u];
while(t)
{
if(t&) add(u,-,k);
t>>=;
k++;
}
num[u]=t=v;
k=;
while(t)
{
if(t&) add(u,,k);
t>>=;
k++;
}
}
if(op==)
{
ans=;
for(k=;k<=;k++)
{
ans=(ans+(quick_pow(,sum(v,k)-sum(u-,k))-)*quick_pow(,k)%mod)%mod;
}
printf("%lld\n",ans);
}
}
return ;
}

最新文章

  1. request.getContextPath()报错
  2. IT人学习方法论(三):高效学习
  3. 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等
  4. CentOS 6使用mutt+msmtp发送邮件
  5. Http Url Get请求方式需要对中文参数进行编码
  6. 【HDOJ】1241 Oil Deposits
  7. Nginx 配置指令的执行顺序(四)
  8. BootStrap 智能表单系列 十 自动完成组件的支持
  9. 染色法判断是否是二分图 hdu2444
  10. js--学习方法之-转
  11. ZooKeeper全面介绍
  12. 写一个PHP函数,实现扫描并打印出指定目录下(含子目录)的所有jpg文件名
  13. Android之Drawable
  14. ACCA AI来袭会议笔记
  15. cURL error 60: SSL certificate problem: unable to get local issuer
  16. XVII Open Cup named after E.V. Pankratiev. Grand Prix of America (NAIPC-2017)
  17. http请求415错误Unsupported Media Type
  18. Customize WCF Envelope and Namespace Prefix
  19. python出现UnicodeEncodeError有可能产生的另一个原因
  20. Java如何监视线程的状态?

热门文章

  1. HDU 1599 find the mincost route (最短路 floyd)
  2. 区块链~Merkle Tree(默克尔树)算法解析~转载
  3. 分布式队列Celery
  4. C++学习之路(三):volatile关键字
  5. centos_7.1.1503_src_1
  6. C语言调用Cmd命令以及执行系统软件
  7. C json实战引擎 一 , 实现解析部分
  8. P1466 集合 Subset Sums(01背包求填充方案数)
  9. UVALive 5099
  10. Fel表达式使用过程中需要注意的问题