K - Transformation
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define p 10007
#define MAXN 100010
using namespace std;
int n,m;
struct nond{
int l,r;
int sum[];
int flag1,flag2,flag3;
}tree[MAXN*];
void up(int now){
tree[now].sum[]=(tree[now*].sum[]+tree[now*+].sum[])%p;
tree[now].sum[]=(tree[now*].sum[]+tree[now*+].sum[])%p;
tree[now].sum[]=(tree[now*].sum[]+tree[now*+].sum[])%p;
}
void build(int now,int l,int r){
tree[now].l=l;tree[now].r=r;
tree[now].sum[]=;tree[now].sum[]=;
tree[now].sum[]=;tree[now].flag2=;
tree[now].flag1=tree[now].flag3=;
if(tree[now].l==tree[now].r) return ;
int mid=(tree[now].l+tree[now].r)/;
build(now*,l,mid);
build(now*+,mid+,r);
up(now);
}
void down(int now){
if(tree[now].flag3){
tree[now*].sum[]=(((tree[now*].r-tree[now*].l+)%p)*tree[now].flag3)%p;
tree[now*].sum[]=(((((tree[now*].r-tree[now*].l+)%p)*tree[now].flag3)%p)*tree[now].flag3)%p;
tree[now*].sum[]=(((((((tree[now*].r-tree[now*].l+)%p)*tree[now].flag3)%p)*tree[now].flag3)%p)*tree[now].flag3)%p;
tree[now*].flag3=tree[now].flag3%p;
tree[now*].flag1=;tree[now*].flag2=; tree[now*+].sum[]=(((tree[now*+].r-tree[now*+].l+)%p)*tree[now].flag3)%p;
tree[now*+].sum[]=(((((tree[now*+].r-tree[now*+].l+)%p)*tree[now].flag3)%p)*tree[now].flag3)%p;
tree[now*+].sum[]=(((((((tree[now*+].r-tree[now*+].l+)%p)*tree[now].flag3)%p)*tree[now].flag3)%p)*tree[now].flag3)%p;
tree[now*+].flag3=tree[now].flag3%p;
tree[now*+].flag1=;tree[now*+].flag2=; tree[now].flag3=;
}
if(tree[now].flag2){
tree[now*].sum[]=(((((tree[now*].sum[]*tree[now].flag2)%p)*tree[now].flag2)%p)*tree[now].flag2)%p;
tree[now*].sum[]=(((tree[now*].sum[]*tree[now].flag2)%p)*tree[now].flag2)%p;
tree[now*].sum[]=(tree[now*].sum[]*tree[now].flag2)%p;
tree[now*].flag1=(tree[now*].flag1*tree[now].flag2)%p;
tree[now*].flag2=(tree[now*].flag2*tree[now].flag2)%p; tree[now*+].sum[]=(((((tree[now*+].sum[]*tree[now].flag2)%p)*tree[now].flag2)%p)*tree[now].flag2)%p;
tree[now*+].sum[]=(((tree[now*+].sum[]*tree[now].flag2)%p)*tree[now].flag2)%p;
tree[now*+].sum[]=(tree[now*+].sum[]*tree[now].flag2)%p;
tree[now*+].flag1=(tree[now*+].flag1*tree[now].flag2)%p;
tree[now*+].flag2=(tree[now*+].flag2*tree[now].flag2)%p; tree[now].flag2=;
}
if(tree[now].flag1){
tree[now*].sum[]=(tree[now*].sum[]+(((*tree[now].flag1*tree[now].flag1%p*tree[now*].sum[])%p+(*tree[now].flag1*tree[now*].sum[])%p)%p+(tree[now*].r-tree[now*].l+)%p*tree[now].flag1%p*tree[now].flag1%p*tree[now].flag1)%p)%p;
tree[now*].sum[]=(tree[now*].sum[]+((tree[now*].r-tree[now*].l+)%p*tree[now].flag1%p*tree[now].flag1%p+(*tree[now].flag1*tree[now*].sum[])%p)%p)%p;
tree[now*].sum[]=(tree[now*].sum[]+(tree[now*].r-tree[now*].l+)%p*tree[now].flag1)%p;
tree[now*].flag1=(tree[now*].flag1+tree[now].flag1)%p; tree[now*+].sum[]=(tree[now*+].sum[]+(((*tree[now].flag1*tree[now].flag1%p*tree[now*+].sum[])%p+(*tree[now].flag1*tree[now*+].sum[])%p)%p+(tree[now*+].r-tree[now*+].l+)%p*tree[now].flag1%p*tree[now].flag1%p*tree[now].flag1)%p)%p;
tree[now*+].sum[]=(tree[now*+].sum[]+((tree[now*+].r-tree[now*+].l+)%p*tree[now].flag1%p*tree[now].flag1%p+(*tree[now].flag1*tree[now*+].sum[])%p)%p)%p;
tree[now*+].sum[]=(tree[now*+].sum[]+(tree[now*+].r-tree[now*+].l+)%p*tree[now].flag1)%p;
tree[now*+].flag1=(tree[now*+].flag1+tree[now].flag1)%p; tree[now].flag1=;
}
}
void changeadd(int now,int l,int r,int k){
if(tree[now].l==l&&tree[now].r==r){
tree[now].sum[]=(tree[now].sum[]+(((*k*k%p*tree[now].sum[])%p+(*k*tree[now].sum[])%p)%p+(tree[now].r-tree[now].l+)%p*k%p*k%p*k)%p)%p;
tree[now].sum[]=(tree[now].sum[]+(((((tree[now].r-tree[now].l+)%p)*k)%p*k)%p+(*k*tree[now].sum[])%p)%p)%p;
tree[now].sum[]=(tree[now].sum[]+(tree[now].r-tree[now].l+)%p*k)%p;
tree[now].flag1=(tree[now].flag1+k)%p;
return ;
}
if(tree[now].flag1||tree[now].flag2!=||tree[now].flag3) down(now);
int mid=(tree[now].l+tree[now].r)/;
if(r<=mid) changeadd(now*,l,r,k);
else if(l>mid) changeadd(now*+,l,r,k);
else { changeadd(now*,l,mid,k); changeadd(now*+,mid+,r,k); }
up(now);
}
void changemul(int now,int l,int r,int k){
if(tree[now].l==l&&tree[now].r==r){
tree[now].sum[]=(((((tree[now].sum[]*k)%p)*k)%p)*k)%p;
tree[now].sum[]=(((tree[now].sum[]*k)%p)*k)%p;
tree[now].sum[]=(tree[now].sum[]*k)%p;
tree[now].flag1=(tree[now].flag1*k)%p;
tree[now].flag2=(tree[now].flag2*k)%p;
return ;
}
if(tree[now].flag1||tree[now].flag2!=||tree[now].flag3) down(now);
int mid=(tree[now].l+tree[now].r)/;
if(r<=mid) changemul(now*,l,r,k);
else if(l>mid) changemul(now*+,l,r,k);
else{ changemul(now*,l,mid,k); changemul(now*+,mid+,r,k); }
up(now);
}
void change(int now,int l,int r,int k){
if(tree[now].l==l&&tree[now].r==r){
tree[now].sum[]=(((tree[now].r-tree[now].l+)%p)*k)%p;
tree[now].sum[]=(((((tree[now].r-tree[now].l+)%p)*k)%p)*k)%p;
tree[now].sum[]=(((((((tree[now].r-tree[now].l+)%p)*k)%p)*k)%p)*k)%p;
tree[now].flag3=k%p;
tree[now].flag1=;tree[now].flag2=;
return ;
}
if(tree[now].flag1||tree[now].flag2!=||tree[now].flag3) down(now);
int mid=(tree[now].l+tree[now].r)/;
if(r<=mid) change(now*,l,r,k);
else if(l>mid) change(now*+,l,r,k);
else{ change(now*,l,mid,k); change(now*+,mid+,r,k); }
up(now);
}
int query(int now,int l,int r,int k){
if(tree[now].l==l&&tree[now].r==r)
return tree[now].sum[k];
if(tree[now].flag1||tree[now].flag2!=||tree[now].flag3) down(now);
int mid=(tree[now].l+tree[now].r)/;
if(r<=mid) return query(now*,l,r,k);
else if(l>mid) return query(now*+,l,r,k);
else return (query(now*,l,mid,k)+query(now*+,mid+,r,k))%p;
}
int main(){
while(scanf("%d%d",&n,&m)&&n!=&&m!=){
build(,,n);
for(int i=;i<=m;i++){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a==) changeadd(,b,c,d);
if(a==) changemul(,b,c,d);
if(a==) change(,b,c,d);
if(a==) printf("%d\n",query(,b,c,d));
}
}
}
K - Transformation的更多相关文章
- K - Transformation HDU - 4578 线段树经典题(好题)
题意:区间 加 变成定值 乘 区间查询:和 平方和 立方和 思路:超级超级超级麻烦的一道题 设3个Lazy 标记分别为 change 改变mul乘 add加 优先度change>m ...
- django模型操作
Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表
- (七)Transformation和action详解-Java&Python版Spark
Transformation和action详解 视频教程: 1.优酷 2.YouTube 什么是算子 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作. 算子分类: 具体: 1.Value ...
- hdu4952 Number Transformation (找规律)
2014多校 第八题 1008 2014 Multi-University Training Contest 8 4952 Number Transformation Number Transform ...
- spark transformation与action操作函数
一.Transformation map(func) 返回一个新的分布式数据集,由每个原元素经过函数处理后的新元素组成 filter(func) 返回一个新的数据集,经过fun函数处理后返回值为tru ...
- HDU 1041 Computer Transformation (简单大数)
Computer Transformation http://acm.hdu.edu.cn/showproblem.php?pid=1041 Problem Description A sequenc ...
- HDU P4578 Transformation
Problem Description Yuanfang is puzzled with the question below: There are n integers, a1, a2, …, an ...
- bzoj 3858: Number Transformation 暴力
3858: Number Transformation Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 82 Solved: 41[Submit][Sta ...
- HDU-4952 Number Transformation
http://acm.hdu.edu.cn/showproblem.php?pid=4952 Number Transformation Time Limit: 2000/1000 MS (Java/ ...
随机推荐
- Android+Jquery Mobile学习系列(3)-创建Android项目
前两章分别对开发环境和Jquery Mobile基础知识进行了介绍,本章介绍创建一个Android项目,并使用WebView控件显示HTML数据. 首先创建一个Android Application项 ...
- 无损压缩算法历史——熵编码是最早出现的,后来才有Lzx这些压缩算法
Lossless Entropy type Unary Arithmetic Asymmetric Numeral Systems Golomb Huffman Adaptive Canonic ...
- Codeforces--630B--Moore's Law(快速幂)
Moore's Law Time Limit: 500MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit ...
- STL 集合部分操作
3.28更新 在EOJ 1641 集合栈计算机中,使用并集和补集时候,第五个参数使用x.begin()会报错:assignment of read-only location,而使用inserter( ...
- This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'的意思是,这版本的 MySQL 不支持使 ...
- 此文章介绍vue-cli脚手架config目录下index.js配置文件
此配置文件是用来定义开发环境和生产环境中所需要的参数 关于注释 当涉及到较复杂的解释我将通过标识的方式(如(1))将解释写到单独的注释模块,请自行查看 上代码 // see http://vuejs- ...
- alipay.trade.refund (统一收单交易退款接口)[支付宝退款]
首页官网退款的api: https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.UTBitT&docType=4& ...
- python的搜索路径与包(package)
python的搜索路径其实是一个列表,它是指导入模块时,python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功,否则导入失败: >>> import ...
- epoll实现reactor模式
- 3.sql基础
sql语句是和dbms交谈专用的语句,不同dbms都认sql语法 sql语句中字符串用单引号 sql语句是大小写不敏感的,不敏感指的是sql关键字,字符串值还是大小写敏感的 创建表.删除表不仅可以手工 ...