

1 #include<cstdio>
2 const int maxn=100000+10;
3 typedef long long ll;
4 ll a[maxn],tree[4*maxn],lazy[4*maxn];
5 void Build(int rt,int l,int r){
6 if(l==r) {
7 tree[rt]=a[l];
8 return;
9 }
10 int mid=(l+r)>>1;
11 Build(rt<<1,l,mid);
12 Build(rt<<1|1,mid+1,r);
13 tree[rt]=tree[rt<<1]+tree[rt<<1|1];
14 }
15 void update(int rt,int l,int r,ll w){
16 tree[rt]+=(r-l+1)*w;
17 lazy[rt]+=w;
18 }
19 void pushdown(int rt,int l,int r){
20 int mid=(l+r)>>1;
21 update(rt<<1,l,mid,lazy[rt]);
22 update(rt<<1|1,mid+1,r,lazy[rt]);
23 lazy[rt]=0;
24 }
25 ll query(int rt,int l,int r,int x){
26 if(l==r) return tree[rt];
27 int mid=(l+r)>>1;
28 pushdown(rt,l,r);
29 if(x<=mid) return query(rt<<1,l,mid,x);
30 else return query(rt<<1|1,mid+1,r,x);
31 }
32 void modify(int rt,int l,int r,int s,int t,ll w){
33 if(s<=l&&t>=r){
34 update(rt,l,r,w);
35 return ;
36 }
37 pushdown(rt,l,r);
38 int mid=(l+r)>>1;
39 if(s<=mid) modify(rt<<1,l,mid,s,t,w);
40 if(t>mid) modify(rt<<1|1,mid+1,r,s,t,w);
41 tree[rt]=tree[rt<<1]+tree[rt<<1|1];
42 }
43 int main(){
44 int n;
45 scanf("%d",&n);
46 for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
47 Build(1,1,n);
48 int m;
49 scanf("%d",&m);
50 for(int i=1;i<=m;i++){
51 char s[8];
52 scanf("%s",s);
53 if(s[0]=='Q'){
54 int x;
55 scanf("%d",&x);
56 ll a=query(1,1,n,x);
57 printf("%lld\n",a);
58 }
59 else {
60 int l,r;
61 ll w;
62 scanf("%d%d%lld",&l,&r,&w);
63 modify(1,1,n,l,r,w);
64 }
65 }
66 return 0;
67 }


1 #include<cstdio>
2 #define lson rt<<1
3 #define rson rt<<1|1
4 const int maxn=1e6+10;
5 int a[maxn]={},tree[4*maxn]={};
6 void Build(int rt,int l,int r){
7 if(l==r){
8 tree[rt]=a[l];
9 return ;
10 }
11 int mid=(l+r)>>1;
12 Build(lson,l,mid);
13 Build(rson,mid+1,r);
14 tree[rt]=tree[lson]+tree[rson];
15 }
16 int query(int rt,int l,int r,int s,int t){
17 if(s<=l&&t>=r) return tree[rt];
18 int mid=(l+r)>>1;
19 if(t<=mid) return query(lson,l,mid,s,t);
20 else if(s>mid) return query(rson,mid+1,r,s,t);
21 else return query(lson,l,mid,s,t)+query(rson,mid+1,r,s,t);
22 }
23 void modify(int rt,int l,int r,int x,int y){
24 if(l==r){
25 tree[rt]+=y;
26 return;
27 }
28 int mid=(l+r)>>1;
29 if(x<=mid) modify(lson,l,mid,x,y);
30 else modify(rson,mid+1,r,x,y);
31 tree[rt]=tree[lson]+tree[rson];
32 }
33 int main(){
34 int n,m;
35 scanf("%d",&n);
36 if(n!=0){
37 for(int i=1;i<=n;i++){
38 scanf("%d",&a[i]);
39 }
40 Build(1,1,n);
41 scanf("%d",&m);
42 char s[5];
43 int k,d,tot=0;
44 for(int i=1;i<=m;i++){
45 scanf("%s%d%d",s,&k,&d);
46 if(s[0]=='S'){
47 printf("%d\n",query(1,1,n,k,d));
48 }
49 else modify(1,1,n,k,d);
50 }
51 }
52 else {
53 scanf("%d",&m);
54 char s[5];
55 int a,b;
56 for(int i=1;i<=m;i++){
57 scanf("%s%d%d",s,&a,&b);
58 if(s[0]=='S') printf("0\n");
59 }
60 }
61 return 0;
62 }


1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 using namespace std;
5 const int maxn=1e6+10;
6 int a[maxn],tree[maxn*4];
7 void Build(int rt,int l,int r){
8 if(l==r){
9 tree[rt]=a[l];
10 return;
11 }
12 int mid=(l+r)>>1;
13 Build(rt<<1,l,mid);
14 Build(rt<<1|1,mid+1,r);
15 tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
16 }
17 int query(int rt,int l,int r,int k,int d){
18 if(k<=l&&d>=r) return tree[rt];
19 int mid=(l+r)>>1;
20 if(d<=mid) return query(rt<<1,l,mid,k,d);
21 else if(k>mid) return query(rt<<1|1,mid+1,r,k,d);
22 else return max(query(rt<<1,l,mid,k,d),query(rt<<1|1,mid+1,r,k,d));
23 }
24 int main(){
25 int n;
26 scanf("%d",&n);
27 for(int i=0;i<=n;i++) scanf("%d",&a[i]);
28 Build(1,1,n);
29 int q;
30 scanf("%d",&q);
31 int a,b;
32 for(int i=1;i<=q;i++){
33 scanf("%d%d",&a,&b);
34 int j=query(1,1,n,a,b);
35 printf("%d\n",j);
36 }
37 return 0;


1 #include<cstdio>
2 #include<cstring>
3 using namespace std;
4 const int maxn=200000+10,mod=1000000007;
5 int a[maxn],tree[4*maxn],b[maxn];
6 int cnt[4*maxn];
7 void Build(int rt,int l,int r){
8 if(l==b[1]&&r==b[1]){
9 tree[rt]+=b[1];
10 cnt[rt]++;
11 return ;
12 }
13 int mid=(l+r)>>1;
14 if(b[1]<=mid) Build(rt<<1,l,mid);
15 else Build(rt<<1|1,mid+1,r);
16 tree[rt]=tree[rt<<1]+tree[rt<<1|1];
17 cnt[rt]=cnt[rt<<1]+cnt[rt<<1|1];
18 }
19 void Modify(int rt,int l,int r,int x,int w){
20 if(l==x&&r==x){
21 tree[rt]=w;
22 cnt[rt]++;
23 return ;
24 }
25 int mid=(l+r)>>1;
26 if(x<=mid) Modify(rt<<1,l,mid,x,w);
27 else Modify(rt<<1|1,mid+1,r,x,w);
28 tree[rt]=tree[rt<<1]+tree[rt<<1|1];
29 cnt[rt]=cnt[rt<<1]+cnt[rt<<1|1];
30 }
31 int query(int rt,int l,int r,int s,int t){
32 if(s<=l&&t>=r){
33 return tree[rt];
34 }
35 int mid=(l+r)>>1;
36 if(t<=mid) return query(rt<<1,l,mid,s,t);
37 else if(s>mid) return query(rt<<1|1,mid+1,r,s,t);
38 else return query(rt<<1,l,mid,s,t)+query(rt<<1|1,mid+1,r,s,t);
39 }
40 int main(){
41 int n,l,x,r,e;
42 scanf("%d%d%d%d%d",&n,&l,&x,&r,&e);
43 a[0]=x%l;
44 b[1]=a[0];
45 Build(1,1,l);
46 int sum=b[1];
47 int q=1;
48 for(int i=1;i<=n-1;i++){
49 a[i]=(a[i-1]*r+e)%l;
50 b[i+1]=a[i];
51 Modify(1,1,l,b[i+1],b[i+1]);
52 int Min=query(1,1,l,1,b[i]);
53 int Max=sum-Min;
54 int ans;
55 ans=cnt[1]*b[i+1]-Min+Max-(i-cnt[1])*b[i+1];
56 q=(q*ans)%mod;
57 sum+=a[i];
58 }
59 printf("%d\n",q);
60 return 0;
61 }
来源:oschina
链接:https://my.oschina.net/u/4324660/blog/4331898