| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | wilson1068 Log Out Mail:0(0) Login Log Archive |
Language:
A Simple Problem with Integers
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval. Input The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000. Output You need to answer all Q commands in order. One answer in a line. Sample Input 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 Sample Output 4 55 9 15 Hint
The sums may exceed the range of 32-bit integers.
Source
POJ Monthly--2007.11.25, Yang Yi
|
[Submit] [Go Back] [Status] [Discuss]
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator
无语了,把 main 函数第3行写成
“ wiile( ~scanf("%d", &T) ) { } ”;
结果 WA 了无数遍;
改成:
“ wiile( EOF != scanf("%d", &T) ) { } ”;
就行了。
可恶 >_<
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAXN 100100
typedef long long LL;
LL sum[MAXN<<2], add[MAXN<<2];
int a[MAXN];
void push_up(int rt){
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void push_down(int rt, int m){
if( add[rt] ){
add[rt<<1] += add[rt];
add[rt<<1|1] += add[rt];
sum[rt<<1] += (m-(m>>1)) * add[rt];
sum[rt<<1|1] += (m>>1) * add[rt];
add[rt] = 0;
}
}
void build(int rt, int l, int r){
add[rt] = 0;
if( l==r ){
sum[rt] = a[l];
return ;
}
int mid = (l+r)>>1;
build(rt<<1, l, mid);
build(rt<<1|1, mid+1, r);
push_up(rt);
}
void updata(int rt, int l, int r, int x, int y, int p){
if( x<=l && r<=y ){
add[rt] += p;
sum[rt] += (LL)(r-l+1)*p;
return;
}
push_down(rt, r-l+1);
int mid = (l+r)>>1;
if( x<=mid ) updata(rt<<1, l, mid, x, y, p);
if( mid<y ) updata(rt<<1|1, mid+1, r, x, y, p);
push_up(rt);
}
LL query(int rt, int l, int r, int x, int y){
if( x<=l && r<=y )
return sum[rt];
push_down(rt, r-l+1);
int mid = (l+r)>>1;
LL r1=0, r2=0;
if( x<=mid ) r1 = query(rt<<1, l, mid, x, y);
if( mid<y ) r2 = query(rt<<1|1, mid+1, r, x, y);
return r1+r2;
}
int main(){
int n, m, x, y;
LL p;
while( EOF != scanf("%d%d", &n, &m) ){
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
build(1,1,n);
char s[11];
while( m-- ){
scanf("%s%d%d", s, &x, &y);
if( 'Q'==s[0] ) printf("%lld\n", query(1,1,n,x,y));
else if( 'C'==s[0] ){
scanf("%d", &p);
updata(1,1,n,x,y,p);
}
}
}
return 0;
}