/*
Transformation
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
#define lson (pos<<1)
#define rson (pos<<1|1)
const int maxn = 100005;
const int mod = 10007;
struct Node{
LL sum[3];
LL mult,add,cover;
int l,r;
int mid(){
return (l + r) >> 1;
}
int len(){
return (r - l + 1);
}
void multchange(LL v){
LL v0 = v % mod;
LL v1 = v0 * v % mod;
LL v2 = v1 * v % mod;
add *= v;
mult *= v;
add %= mod;
mult %= mod;
sum[2] *= v2; sum[2] %= mod;
sum[1] *= v1; sum[1] %= mod;
sum[0] *= v0; sum[0] %= mod;
}
void addchange(LL v){
LL v2 = sum[1] * 3 * v + sum[0] * 3 * v * v + len() * v * v * v;
LL v1 = sum[0] * 2 * v + len() * v * v;
LL v0 = v * len();
add += v;
add %= mod;
sum[2] += v2; sum[2] %= mod;
sum[1] += v1; sum[1] %= mod;
sum[0] += v0; sum[0] %= mod;
}
void coverchange(LL v){
LL v2 = v * v * v % mod;
LL v1 = v * v % mod;
LL v0 = v % mod;
cover = v;
add = 0;
mult = 1;
sum[2] = v2 * len() % mod;
sum[1] = v1 * len() % mod;
sum[0] = v0 * len() % mod;
}
}node[maxn << 2];
void pushdown(int pos){
if(node[pos].cover){
node[lson].coverchange(node[pos].cover);
node[rson].coverchange(node[pos].cover);
node[pos].cover = 0;
}
if(node[pos].mult != 1){
node[lson].multchange(node[pos].mult);
node[rson].multchange(node[pos].mult);
node[pos].mult = 1;
}
if(node[pos].add){
node[lson].addchange(node[pos].add);
node[rson].addchange(node[pos].add);
node[pos].add = 0;
}
}
void pushup(int pos){
node[pos].sum[2] = (node[lson].sum[2] + node[rson].sum[2]) % mod;
node[pos].sum[1] = (node[lson].sum[1] + node[rson].sum[1]) % mod;
node[pos].sum[0] = (node[lson].sum[0] + node[rson].sum[0]) % mod;
}
void build(int l,int r,int pos){
node[pos].l = l;
node[pos].r = r;
node[pos].mult = 1;
node[pos].add = node[pos].cover = 0;
node[pos].sum[0] = node[pos].sum[1] = node[pos].sum[2] = 0;
if(l == r) return;
int mid = node[pos].mid();
build(l,mid,lson);
build(mid + 1,r,rson);
}
void update(int l,int r,int pos,int op,LL d){
if(l <= node[pos].l && node[pos].r <= r){
if(op == 1)
node[pos].addchange(d);
else if(op == 2)
node[pos].multchange(d);
else if(op == 3)
node[pos].coverchange(d);
return;
}
pushdown(pos);
int mid = node[pos].mid();
if(l <= mid)
update(l,r,lson,op,d);
if(r > mid)
update(l,r,rson,op,d);
pushup(pos);
}
LL query(int l,int r,int pos,int op){
if(l <= node[pos].l && node[pos].r <= r)
return node[pos].sum[op] % mod;
int mid = node[pos].mid();
pushdown(pos);
LL ans = 0;
if(l <= mid)
ans += query(l,r,lson,op);
if(r > mid)
ans += query(l,r,rson,op);
pushup(pos);
return ans % mod;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)){
if(!n && !m) break;
int op,x,y,c;
build(1,n,1);
for(int i = 0; i < m; i++){
scanf("%d%d%d%d",&op,&x,&y,&c);
if(op <= 3)
update(x,y,1,op,c);
else
printf("%I64d\n",query(x,y,1,c - 1));
}
}
return 0;
}
HDU 4578
最新推荐文章于 2024-08-19 01:03:13 发布