/*
lazy思想的运用,因为查询多种,如果全记录就太繁了,lazy就是如果该区间的每一个叶子的状态都相同就不用深入下去该值,只要暂时标记下,查询的时候也不用下去,直接计算; */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX_N 100005
#define mod 10007
#define ll long long
using namespace std;
struct tree
{
ll l,r,la[];
ll same,s;//s表示该区间的值都是s;
}tr[MAX_N*];
ll ans=;
void build(int rt,int l,int r)
{
tr[rt].l=l;
tr[rt].r=r;
tr[rt].same=;
tr[rt].s=;
memset(tr[rt].la,,sizeof(tr[rt].la));
tr[rt].la[]=;
if(l==r)
return ;
int mid=(l+r)/;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
}
void Pushdown(int rt)
{
if(tr[rt].same==)
{
int L=rt<<,R=rt<<|;
tr[L].la[]+=tr[rt].la[];
tr[L].la[]*=tr[rt].la[];
tr[L].la[]=tr[rt].la[];
tr[L].s=tr[R].s=tr[rt].s;
tr[R].la[]+=tr[rt].la[];
tr[R].la[]*=tr[rt].la[];
tr[R].la[]=tr[rt].la[];
tr[L].same=tr[R].same=;
tr[rt].la[]=;
tr[rt].la[]=;
tr[rt].la[]=;
tr[rt].same=;
}
return;
}
void Update(int rt,int l,int r,int x,int t)
{
if(t==)
{
if(tr[rt].l==l&&tr[rt].r==r&&tr[rt].same==)
{
tr[rt].la[]+=x;//关键;
tr[rt].la[]%=mod;
tr[rt].s=tr[rt].s+x;
return ;
}
}
else if(t==)
{
if(tr[rt].l==l&&tr[rt].r==r&&tr[rt].same==)
{
tr[rt].la[]*=x;
tr[rt].la[]%=mod;
tr[rt].s=tr[rt].s*x%mod;
return ;
}
}
else
{
if(tr[rt].l==l&&tr[rt].r==r)
{
tr[rt].la[]=x;
tr[rt].s=x;
tr[rt].same=;
return;
}
}
if(tr[rt].same==)
Pushdown(rt);
int L=rt<<,R=rt<<|;
if(l<=tr[L].r)
{
if(r<=tr[L].r)
Update(L,l,r,x,t);
else
Update(L,l,tr[L].r,x,t);
}
if(r>=tr[R].l)
{
if(l>=tr[R].l)
Update(R,l,r,x,t);
else
Update(R,tr[R].l,r,x,t);
}
}
void Query(int rt,int l,int r,int x)
{
if(tr[rt].l==l&&tr[rt].r==r&&tr[rt].same==)
{
ll n=r-l+,temp=;
for(int i=;i<=x;i++)
{
temp*=tr[rt].s%mod;
temp%=mod;
}
ans+=(temp*n%mod)%mod;
return ;
}
if(tr[rt].same==)
Pushdown(rt);
int L=rt<<,R=rt<<|;
if(l<=tr[L].r)
{
if(r<=tr[L].r)
Query(L,l,r,x);
else
Query(L,l,tr[L].r,x);
}
if(r>=tr[R].l)
{
if(l>=tr[R].l)
Query(R,l,r,x);
else
Query(R,tr[R].l,r,x);
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
memset(tr,,sizeof(tr));
build(,,n);
for(int i=;i<m;i++)
{
int x,y,ty,c;
scanf("%d%d%d%d",&ty,&x,&y,&c);
if(ty==)
{
ans=;
Query(,x,y,c);
cout<<ans%mod<<endl;
}
else
{
Update(,x,y,c,ty);
} }
}
return ;
}

kb-07线段树--11--区间多重该值多种查询的更多相关文章

  1. FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解

    题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...

  2. 刷题向》关于线段树的区间开根号 BZOJ3211(NORMAL+)

    这是一道关于线段树的区间开根号的裸题,没什么好讲的. 值得注意的是,因为有区间开根号的性质,所以我们每一次更改操作只能把更改区间所覆盖的所有元素全部查找,当然你直接找效率明显爆炸... 能够注意到,指 ...

  3. ZOJ 2301 Color the Ball 线段树(区间更新+离散化)

    Color the Ball Time Limit: 2 Seconds      Memory Limit: 65536 KB There are infinite balls in a line ...

  4. poj 3468:A Simple Problem with Integers(线段树,区间修改求和)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 58269   ...

  5. zoj3686(线段树的区间更新)

    对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a ...

  6. Codeforces Round #222 (Div. 1) D. Developing Game 线段树有效区间合并

    D. Developing Game   Pavel is going to make a game of his dream. However, he knows that he can't mak ...

  7. hiho一下20周 线段树的区间修改

    线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了 ...

  8. 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

    原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...

  9. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. .net后台使用post方式对指定地址的方法传值并且获取结果的方法

    /// <summary> /// .net 后台 post http地址请求 /// </summary> /// <param name="uri" ...

  2. UVA 10891 Game of Sum (决策优化)

    这是一个零和博弈,最高得分只和序列以及谁先手有关. d[i][j],表示i到j的序列当前取的这个人的最高得分,转移以后状态是新的区间和另一个人取,从中取最小值. 决策的最小值也可递推. #includ ...

  3. Android(java)学习笔记121:BroadcastReceiver之 自定义广播

    广播使用:               电台:对外发送信号.---------电台发送广播(可以自定义)               收音机:接收电台的信号.-----广播接收者 这里,我们就说明自定 ...

  4. 《队长说得队》【Alpha】Scrum meeting 4

    项目 内容 这个作业属于哪个课程 >>2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 >>实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 ...

  5. linux命令行调试邮件服务器

    linux命令行调试邮件服务器 1. Linux客户端调试邮件过程 [root@mxtest ~]# telnet mail.xx.com 25 Trying 172.16.236.103... Co ...

  6. ios sinaweibo 客户端(二)

    这一篇博文讲述发微博界面的实现. 首先我们先了解一下在这个发微博界面中需要做哪些事情吧! (1) 发微博包括文字内容和微博图片,所以我们可以用一个textview来装载微博文字内容,用一个imagev ...

  7. 初涉斯坦纳树&&bzoj4774: 修路

    斯坦纳树的基础应用 斯坦纳树有什么用 个人一点粗浅理解…… 最基本形式的斯坦纳树问题(以下简称母问题):给定图G和一个关键点集V.求在G中选取一个权值最小(这里权值可以有很多变式)的边集E使V中的点两 ...

  8. RSA非对称加密算法实现过程

    RSA非对称加密算法实现过程 非对称加密算法有很多,RSA算法就是其中比较出名的算法之一,下面是具体实现过程 <?php /** */ class Rsa { /** * private key ...

  9. Spring Cloud构建微服务架构(二)分布式配置中心

     注:此文不适合0基础学习者直接阅读,请先完整的将作者关于微服务的博文全部阅读一遍,如果还有疑问,可以再来阅读此文,地址:http://blog.csdn.net/sosfnima/article/d ...

  10. Java并发编程的艺术 记录(二)

    volatile的应用 volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量.Java语言提供了volatil ...