题解:这道题要打一个乘标记一个加标记,两个标记的优先级是乘法高,所以在乘的时候要将加标记同时乘上一个c,当然,对于每个非完整块一定要记得暴力重构整个块,把加标记和乘标记都初始化.

代码如下:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 10007
using namespace std; int tag1[],tag2[],lump[],a[];
int n,sz; void reset(int x)
{
for(int i=(x-)*sz+;i<=min(x*sz,n);i++)
{
a[i]=(a[i]*tag2[x]+tag1[x])%mod;
}
tag1[x]=;
tag2[x]=;
} void add(int l,int r,int c)
{
reset(lump[l]);
for(int i=l;i<=min(lump[l]*sz,r);i++)
{
a[i]+=c;
a[i]%=mod;
}
if(lump[l]!=lump[r])
{
reset(lump[r]);
for(int i=(lump[r]-)*sz+;i<=r;i++)
{
a[i]+=c;
a[i]%=mod;
}
}
for(int i=lump[l]+;i<=lump[r]-;i++)
{
tag1[i]+=c;
tag1[i]%=mod;
}
} void mul(int l,int r,int c)
{
reset(lump[l]);
for(int i=l;i<=min(lump[l]*sz,r);i++)
{
a[i]*=c;
a[i]%=mod;
}
if(lump[l]!=lump[r])
{
reset(lump[r]);
for(int i=(lump[r]-)*sz+;i<=r;i++)
{
a[i]*=c;
a[i]%=mod;
}
}
for(int i=lump[l]+;i<=lump[r]-;i++)
{
tag1[i]*=c;
tag1[i]%=mod;
tag2[i]*=c;
tag2[i]%=mod;
}
} int main()
{
int opt,l,r,c;
scanf("%d",&n);
sz=sqrt(n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
lump[i]=(i-)/sz+;
}
for(int i=;i<=lump[n];i++)
{
tag2[i]=;
}
for(int i=;i<=n;i++)
{
scanf("%d%d%d%d",&opt,&l,&r,&c);
if(!opt)
{
add(l,r,c);
}
else
{
if(opt==)
{
mul(l,r,c);
}
else
{
printf("%d\n",(a[r]*tag2[lump[r]]+tag1[lump[r]])%mod);
}
}
}
}

最新文章

  1. 带你玩转Visual Studio
  2. Java程序员
  3. Uva10328 dp(递推+高精度)
  4. HDU 3074 (线段树+模P乘法)
  5. 将U盘分成 启动盘+文件存储区
  6. spoj 7258 SUBLEX(SAM,名次)
  7. utf8_to_utf16
  8. WISPr1.0
  9. seajs笔记
  10. flutter 主题切换
  11. PHP变量传值赋值和引用赋值,变量销毁
  12. 用Maxima画出一些有趣的图
  13. vue添加页面键盘事件
  14. Open-Drain与Push-Pull【转】
  15. x86指令格式
  16. 启动与关闭comcat服务器
  17. console.log() 字体颜色
  18. jenkins权限控制
  19. Solr系列一:Solr(Solr介绍、Solr应用架构、Solr安装使用)
  20. ubuntu下转换flv格式为mp4格式

热门文章

  1. etcd使用经历
  2. mysql + unidac 使用事务例子
  3. 关联数组的错误,mysql insert varchar 原生的错误
  4. js大法处理富文本输入
  5. java里的switch循环--你妹考试落榜了
  6. Spring缓存源码剖析:(二)CacheManager
  7. Quartz 用 cron 表达式存放执行计划
  8. oracle删除多个分区表
  9. js操作serviceWorker缓存静态文件
  10. dubbo学习 一 dubbo概述