Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
Register

## Re:AC代码

Posted by 1048152025 at 2018-05-08 20:06:31 on Problem 3468
In Reply To:AC代码 Posted by:ACINE at 2018-02-27 19:45:20
```> #include<cstdio>
> #include<iostream>
>
> #define N 100000
> #define ll long long
>
> using namespace std;
>
> char ord;
> int n,q;
> ll A[N+10];
>
> struct node
> {
> 	int l,r;
> 	ll sum;
> 	ll val;
> }date[6*N];
>
> void init(int root,int l,int r)
> {
> 	date[root].l=l;
> 	date[root].r=r;
>
> 	if(l==r) {
>
> 		date[root].sum=A[l];
>
> 		return;
> 	}
>
> 	int mid=(l+r)>>1;
>
> 	init(root*2,l,mid);
> 	init(root*2+1,mid+1,r);
>
> 	date[root].sum=date[root*2].sum+date[root*2+1].sum;
> }
>
> void update(int root,int a,int b,ll c)
> {
> 	if(date[root].val!=0) {
>
> 		date[root*2].val+=date[root].val;
> 		date[root*2+1].val+=date[root].val;
> 		date[root*2].sum+=date[root].val*(date[root*2].r-date[root*2].l+1);
> 		date[root*2+1].sum+=date[root].val*(date[root*2+1].r-date[root*2+1].l+1);
> 		date[root].val=0;
> 	}
>
> 	if(date[root].l==a&&date[root].r==b) {
>
> 		date[root].val=c;
> 		date[root].sum+=c*(date[root].r-date[root].l+1);
>
> 		return;
> 	}
>
> 	int mid=(date[root].l+date[root].r)>>1;
>
> 	if(a<=mid&&b<=mid) update(root*2,a,b,c);
> 	else if(a>mid&&b>mid) update(root*2+1,a,b,c);
> 	else {
>
> 		update(root*2,a,mid,c);
> 		update(root*2+1,mid+1,b,c);
> 	}
>
> 	date[root].sum=date[root*2].sum+date[root*2+1].sum;
> }
>
> ll query(int root,int a,int b)
> {
> 	if(date[root].val) {
>
> 		date[root*2].val+=date[root].val;
> 		date[root*2+1].val+=date[root].val;
> 		date[root*2].sum+=date[root].val*(date[root*2].r-date[root*2].l+1);
> 		date[root*2+1].sum+=date[root].val*(date[root*2+1].r-date[root*2+1].l+1);
> 		date[root].val=0;
> 	}
>
> 	if(date[root].l==a&&date[root].r==b) return date[root].sum;
>
> 	int mid=(date[root].l+date[root].r)>>1;
>
> 	if(a<=mid&&b<=mid) return query(root*2,a,b);
> 	else if(a>mid&&b>mid) return query(root*2+1,a,b);
> 	return query(root*2,a,mid)+query(root*2+1,mid+1,b);
> }
>
> int main()
> {
> 	scanf("%d%d",&n,&q);
>
> 	for(int i=1;i<=n;i++)	scanf("%lld",&A[i]);
>
> 	init(1,1,n);
>
> 	for(int i=1;i<=q;i++) {
>
> 		scanf("%s",&ord);
>
> 		if(ord=='C') {
>
> 			int a,b;
> 			ll c;
>
> 			scanf("%d%d%lld",&a,&b,&c);
>
> 			update(1,a,b,c);
> 		}
> 		else {
>
> 			int a,b;
>
> 			scanf("%d%d",&a,&b);
>
> 			printf("%lld\n",query(1,a,b));
> 		}
> 	}
>
> 	return 0;
> }
```

Followed by: