1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include <cstdio> #define ls (x<<1) #define rs (x<<1|1) using namespace std; const int N = 100010; const int mod = 10007; int sum1[N<<2],sum2[N<<2],sum3[N<<3]; int add[N<<2],mul[N<<2]; int n,q; void updata(int x,int op,int len,int t1) { int t2=(t1*t1)%mod; int t3=(t1*t2)%mod; if(op==1) { sum3[x]=(sum3[x]+(3*t1*sum2[x])%mod+(3*t2*sum1[x])%mod+(t3*len)%mod)%mod; sum2[x]=(sum2[x]+(2*t1*sum1[x])%mod+(len*t2)%mod)%mod; sum1[x]=(sum1[x]+(len*t1)%mod)%mod; add[x]=(add[x]+t1)%mod; }else if(op==2) { sum3[x]=(sum3[x]*t3)%mod; sum2[x]=(sum2[x]*t2)%mod; sum1[x]=(sum1[x]*t1)%mod; add[x]=(add[x]*t1)%mod; mul[x]=(mul[x]*t1)%mod; } } void pushdown(int x,int l,int r) { int m=(l+r)>>1; if(mul[x]!=1) { updata(ls,2,m-l+1,mul[x]); updata(rs,2,r-m,mul[x]); mul[x]=1; } if(add[x]!=0) { updata(ls,1,m-l+1,add[x]); updata(rs,1,r-m,add[x]); add[x]=0; } } void pushup(int x) { sum1[x]=(sum1[ls]+sum1[rs])%mod; sum2[x]=(sum2[ls]+sum2[rs])%mod; sum3[x]=(sum3[ls]+sum3[rs])%mod; } void modify(int L,int R,int op,int v,int l=1,int r=n,int x=1) { if(L<=l&&r<=R) { updata(x,op,r-l+1,v); return ; } int m=(l+r)>>1; pushdown(x,l,r); if(L<=m) modify(L,R,op,v,l,m,ls); if(R>m) modify(L,R,op,v,m+1,r,rs); pushup(x); } int query(int L,int R,int k,int l=1,int r=n,int x=1) { if(L<=l&&r<=R) { if(k==1) return sum1[x]; if(k==2) return sum2[x]; if(k==3) return sum3[x]; } int m=(l+r)>>1,ret=0; pushdown(x,l,r); if(L<=m) ret=query(L,R,k,l,m,ls); if(R>m) ret=(ret+query(L,R,k,m+1,r,rs))%mod; return ret; } void build(int l=1,int r=n,int x=1) { add[x]=0;mul[x]=1; if(l==r) { sum1[x]=sum2[x]=sum3[x]=0; return ; } int m=(l+r)>>1; build(l,m,ls); build(m+1,r,rs); pushup(x); } int main() { while(scanf("%d%d",&n,&q)!=EOF) { if(n==0&&q==0) break; build(); while(q--) { int op,x,y,z; scanf("%d%d%d%d",&op,&x,&y,&z); if(op==4) { printf("%d\n",query(x,y,z)); } if(op==1) { modify(x,y,1,z); } if(op==2) { modify(x,y,2,z); } if(op==3) { modify(x,y,2,0); modify(x,y,1,z); } } } }
|