1A,裸地线段树
题的链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define N 100010
const int mod=10007;
struct node
{
int l,r,lazy;
int sum1,sum2,sum3;
int mid()
{
return (l+r)>>1;
}
}tree[4*N];
void build(int id,int x,int y)
{
tree[id].l=x;
tree[id].r=y;
tree[id].lazy=tree[id].sum1=tree[id].sum2=tree[id].sum3=0;
if(x==y)
return ;
int mid=(x+y)>>1;
build(id<<1,x,mid);
build(id<<1|1,mid+1,y);
}
void pushdown(int id)
{
tree[id<<1].lazy=tree[id<<1|1].lazy=tree[id].lazy;
int mid=tree[id].mid();
int te=tree[id].lazy;
int x=tree[id].l;
int y=tree[id].r;
tree[id<<1].sum1=te*(mid-x+1)%mod;
tree[id<<1].sum2=te*te%mod*(mid-x+1)%mod;
tree[id<<1].sum3=te*te%mod*te%mod*(mid-x+1)%mod;
tree[id<<1|1].sum1=te*(y-mid)%mod;
tree[id<<1|1].sum2=te*te%mod*(y-mid)%mod;
tree[id<<1|1].sum3=te*te%mod*te%mod*(y-mid)%mod;
}
void pushup(int id)
{
if(tree[id<<1].lazy==tree[id<<1|1].lazy)
tree[id].lazy=tree[id<<1].lazy;
else
tree[id].lazy=-1;
tree[id].sum1=(tree[id<<1].sum1+tree[id<<1|1].sum1)%mod;
tree[id].sum2=(tree[id<<1].sum2+tree[id<<1|1].sum2)%mod;
tree[id].sum3=(tree[id<<1].sum3+tree[id<<1|1].sum3)%mod;
}
void change(int id,int x,int y,int z,int h)
{
if(tree[id].l==x && tree[id].r==y && tree[id].lazy!=-1)
{
int te;
if(h==1) te=(tree[id].lazy+z)%mod;
else if(h==2) te=(tree[id].lazy*z)%mod;
else if(h==3) te=z;
tree[id].lazy=te;
tree[id].sum1=te*(y-x+1)%mod;
tree[id].sum2=te*te%mod*(y-x+1)%mod;
tree[id].sum3=te*te%mod*te%mod*(y-x+1)%mod;
return ;
}
if(tree[id].lazy!=-1) pushdown(id);
int mid=tree[id].mid();
if(y<=mid)
change(id<<1,x,y,z,h);
else if(mid+1<=x)
change(id<<1|1,x,y,z,h);
else
{
change(id<<1,x,mid,z,h);
change(id<<1|1,mid+1,y,z,h);
}
pushup(id);
}
int query(int id,int x,int y,int z)
{
if(tree[id].l==x && tree[id].r==y)
{
if(z==1) return tree[id].sum1;
if(z==2) return tree[id].sum2;
if(z==3) return tree[id].sum3;
}
if(tree[id].lazy!=-1) pushdown(id);
int mid=tree[id].mid();
if(y<=mid) return query(id<<1,x,y,z);
else if(mid+1<=x) return query(id<<1|1,x,y,z);
else
{
return (query(id<<1,x,mid,z)+query(id<<1|1,mid+1,y,z))%mod;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n+m)
{
int a,b,c,d,i,j,k;
build(1,1,n);
while(m--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a!=4)
change(1,b,c,d,a);
else
printf("%d\n",query(1,b,c,d));
}
}
}