线段树

  1 #include <iostream>
  2 #include <cstdio>
  3 using namespace std;
  4 
  5 typedef long long ll;
  6 const ll MAXN=100010;
  7 const ll MOD=571373;
  8 
  9 struct Tree
 10 {
 11     ll l,r;
 12     ll sum;
 13     ll atag;
 14     ll mtag;
 15 }t[MAXN<<2];
 16 ll a[MAXN<<2];
 17 
 18 ll cnt=0;
 19 void buildTree(ll root,ll l,ll r)   //建树
 20 {
 21     t[root].l=l,t[root].r=r;
 22     if (l==r) t[root].sum=a[++cnt];
 23     else
 24     {
 25         ll mid=(l+r)>>1;
 26         buildTree(root<<1,l,mid);
 27         buildTree(root<<1|1,mid+1,r);
 28         t[root].sum=(t[root<<1].sum+t[root<<1|1].sum)%MOD;
 29     }
 30     return;
 31 }
 32 
 33 void pushDown(ll root)   //下传标记
 34 {
 35     t[root<<1].sum=(t[root].mtag*t[root<<1].sum+((t[root<<1].r-t[root<<1].l+1)*t[root].atag)%MOD)%MOD;
 36     t[root<<1|1].sum=(t[root].mtag*t[root<<1|1].sum+((t[root<<1|1].r-t[root<<1|1].l+1)*t[root].atag)%MOD)%MOD;
 37     t[root<<1].mtag=(t[root<<1].mtag*t[root].mtag)%MOD;
 38     t[root<<1|1].mtag=(t[root<<1|1].mtag*t[root].mtag)%MOD;
 39     t[root<<1].atag=(t[root<<1].atag*t[root].mtag+t[root].atag)%MOD;
 40     t[root<<1|1].atag=(t[root<<1|1].atag*t[root].mtag+t[root].atag)%MOD;
 41     t[root].mtag=1;
 42     t[root].atag=0;
 43     return;
 44 }
 45 void mul(ll root,ll l,ll r,ll val)   //区间修改*
 46 {
 47     if (t[root].r<l || t[root].l>r) return;
 48     if (t[root].l>=l && t[root].r<=r)
 49     {
 50         t[root].sum=t[root].sum*val%MOD;
 51         t[root].atag=t[root].atag*val%MOD;
 52         t[root].mtag=t[root].mtag*val%MOD;
 53         return;
 54     }
 55     if (t[root].mtag!=1 || t[root].atag!=0) pushDown(root);
 56     mul(root<<1,l,r,val),mul(root<<1|1,l,r,val);
 57     t[root].sum=(t[root<<1].sum+t[root<<1|1].sum)%MOD;
 58     return;
 59 }
 60 
 61 void add(ll root,ll l,ll r,ll val)   //区间修改+
 62 {
 63     if (t[root].r<l || t[root].l>r) return;
 64     if (t[root].l>=l && t[root].r<=r)
 65     {
 66         t[root].sum=(t[root].sum+val*(t[root].r-t[root].l+1))%MOD;
 67         t[root].atag=(t[root].atag+val)%MOD;
 68         return;
 69     }
 70     if (t[root].mtag!=1 || t[root].atag!=0) pushDown(root);
 71     add(root<<1,l,r,val),add(root<<1|1,l,r,val);
 72     t[root].sum=(t[root<<1].sum+t[root<<1|1].sum)%MOD;
 73     return;
 74 }
 75 
 76 ll query(ll root,ll l,ll r)
 77 {
 78     if (t[root].r<l || t[root].l>r) return 0;
 79     if (t[root].l>=l && t[root].r<=r) return t[root].sum;
 80     if (t[root].mtag!=1 || t[root].atag!=0) pushDown(root);
 81     return (query(root<<1,l,r)+query(root<<1|1,l,r))%MOD;
 82 }
 83 
 84 int main()
 85 {
 86     ll n,m,p;
 87     scanf("%lld%lld%lld",&n,&m,&p);
 88     for (ll i=1;i<=n;i++) scanf("%lld",&a[i]);
 89     for (ll i=0;i<MAXN<<2;i++) t[i].sum=t[i].atag=0,t[i].mtag=1;   //init
 90 
 91     buildTree(1,1,n);
 92 
 93     while (m--)
 94     {
 95         ll opt;
 96         scanf("%lld",&opt);
 97         ll x,y,k;
 98         if (opt==1)
 99         {
100             scanf("%lld%lld%lld",&x,&y,&k);
101             mul(1,x,y,k);
102         }
103         else if (opt==2)
104         {
105             scanf("%lld%lld%lld",&x,&y,&k);
106             add(1,x,y,k);
107         }
108         else if (opt==3)
109         {
110             scanf("%lld%lld",&x,&y);
111             printf("%lld\n",query(1,x,y));
112         }
113     }
114 
115     return 0;
116 }

 

上一篇:现代操作系统:进程与线程(八)


下一篇:js 表单内容使用ajax以json格式混合提交