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/ ...
随机推荐
- hdu 1075(字典树)
What Are You Talking About Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/204800 K ...
- (Go)04.go工作区目录规范及简单例子
一.规范目录结构 D:\project\src\go_dev\day1\example1 二.设置GOPAH环境变量 三.hello world 1.hello world package main ...
- bzoj 2599(点分治)
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 3642 Solved: 1081[Submit][Statu ...
- javascript从作用域链的角度看闭包
闭包 闭包是一个能访问外部函数定义的变量的函数. 为什么? 当访问一个变量时,解释器会首先在当前作用域查找标示符,如果没有找到,就去父作用域找,直到找到该变量的标示符或者不再存在父作用域了,这就是作用 ...
- DNS(域名系统)
DNS(Domain Name System),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的Ip数串.通过主机名,最终得到该主机 ...
- Android开发中的日期格式化
下面的转换符来自Java,但是在android中同样可用.(以下表格内容来自互联网.) 常见日期格式化转换符 转换符 说 明 示 例 %te 一个月中的某一天(1-31) 2 %tb 指定语言环 ...
- 使用protobuf传递网络消息
1.获取protobuf及相关依赖 新建install_protobuf.bat脚本,粘贴以下代码 ::参考文章 https://github.com/google/protobuf/blob/mas ...
- python--6、re模块
re模块 用于在正则表达式匹配操作. python中为了避免实现输出'\','\n'字符的转义问题(如正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python ...
- Hadoop学习笔记(一)Hadoop的单节点安装
要想深入学习Hadoop分布式文件系统,首先需要搭建Hadoop的实验环境,Hadoop有两种安装模式,即单节点集群模式安装(也称为伪分布式)和完全分布式模式安装,本节只介绍单节点模式的安装,参考官方 ...
- Android自定义开机和关机动画
Android自定义开机和关机动画 Android在开机的过程中,会经历三张图片,关于静态图的修改在我的这篇文章中有介绍到: Android开机图片替换 现在要介绍的是怎么用动画替换静态图片.开/关机 ...