我把代码提交至POJ的时候,语言选择G++就会WA,但是如果选C++就是AC。请问这是什么原因?
代码(就是一个分块的模板)
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int n, q;
const int MaxN = 1e5 + 114;
ll a[MaxN], sum[MaxN], add_tag[MaxN];
int L[MaxN], R[MaxN], pos[MaxN];
void add(int l, int r, ll d) {
if(pos[l] == pos[r]) {
for(int i = l; i <= r; i++) {
a[i] += d;
}
sum[pos[l]] += d * (r - l + 1);
} else {
for(int i = l; i <= R[pos[l]]; i++) {
a[i] += d;
}
sum[pos[l]] += d * (R[pos[l]] - l + 1);
for(int i = L[pos[r]]; i <= r; i++) {
a[i] += d;
}
sum[pos[r]] += d * (r - L[pos[r]] + 1);
for(int i = pos[l] + 1; i <= pos[r] - 1; i++) {
add_tag[i] += d;
}
}
}
ll ask(int l, int r) {
ll res = 0;
if(pos[l] == pos[r]) {
for(int i = l; i <= r; i++) {
res += a[i];
}
return res + (r - l + 1) * add_tag[pos[l]];
} else {
for(int i = l; i <= R[pos[l]]; i++) {
res += a[i];
}
res += add_tag[pos[l]] * (R[pos[l]] - l + 1);
for(int i = L[pos[r]]; i <= r; i++) {
res += a[i];
}
res += add_tag[pos[r]] * (r - L[pos[r]] + 1);
for(int i = pos[l] + 1; i <= pos[r] - 1; i++) {
res += sum[i] + add_tag[i] * (R[i] - L[i] + 1);
}
return res;
}
}
int main() {
scanf("%d%d", &n, &q);
for(int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}
int t = sqrt(n * 1.0);
for(int i = 1; i <= t; i++) {
L[i] = (i - 1) * t + 1;
R[i] = i * t;
}
if(R[t] < n) {
t++;
L[t] = R[t - 1] + 1;
R[t] = n;
}
for(int i = 1; i <= t; i++) {
for(int j = L[i]; j <= R[i]; j++) {
pos[j] = i;
sum[i] += a[j];
}
}
for(int i = 1; i <= q; i++) {
char opt[5];
scanf("%s", opt);
//cout << "> " << opt << endl;
if(opt[0] == 'C') {
int l, r, d;
scanf("%d%d%d", &l, &r, &d);
add(l, r, d);
} else if(opt[0] == 'Q'){
int l, r;
scanf("%d%d", &l, &r);
printf("%lld\n", ask(l, r));
}
}
return 0;
}