ezoiHY @ 2019-01-27 20:30:42
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,bel[1001],blb[1001],ble[1001],num[1001];
long long tag[1001],a[1000001],blok[1001][1001];
int query(int l,int r,long long w){
int bl=bel[l];
int br=bel[r];
int ret=0;
for(int i=bl+1;i<br;i++){
ret+=num[i]-(lower_bound(blok[i]+1,blok[i]+num[i]+1,w-tag[i])-blok[i])+1;
}
if(bl!=br){
if(l==blb[bl]){
ret+=num[bl]-(lower_bound(blok[bl]+1,blok[bl]+num[bl]+1,w-tag[bl])-blok[bl])+1;
}else {
for(int i=l;i<=ble[bl];i++){
if(a[i]>=w-tag[bl])ret++;
}
}
if(r==ble[br]){
ret+=num[br]-(lower_bound(blok[br]+1,blok[br]+num[br]+1,w-tag[br])-blok[bl])+1;
}else {
for(int i=blb[br];i<=r;i++){
if(a[i]>=w-tag[bl])ret++;
}
}
}else {
for(int i=l;i<=r;i++){
if(a[i]>=w-tag[bl])ret++;
}
}
return ret;
}
void add(int l,int r,long long w){
int bl=bel[l];
int br=bel[r];
for(int i=bl+1;i<br;i++){
tag[i]+=w;
}
if(bl!=br){
if(l==blb[bl]){
tag[bl]+=w;
}else {
for(int i=l;i<=ble[bl];i++){
a[i]+=w;
}
for(int i=blb[bl];i<=ble[bl];i++){
blok[bl][i-blb[bl]+1]=a[i];
}
sort(blok[bl]+1,blok[bl]+num[bl]+1);
}
if(r==ble[br]){
tag[br]+=w;
}else {
for(int i=blb[br];i<=r;i++){
a[i]+=w;
}
for(int i=blb[br];i<=ble[br];i++){
blok[br][i-blb[br]+1]=a[i];
}
sort(blok[br]+1,blok[br]+num[br]+1);
}
}else {
for(int i=l;i<=r;i++){
a[i]+=w;
}
for(int i=blb[br];i<=ble[br];i++){
blok[br][i-blb[br]+1]=a[i];
}
sort(blok[br]+1,blok[br]+num[br]+1);
}
}
int main(){
scanf("%d%d",&n,&m);
int gg=sqrt(n),cnt=0,tmp=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
if(i%gg==1){
cnt++;
tmp=0;
ble[cnt-1]=i-1;
blb[cnt]=i;
}
blok[cnt][++tmp]=a[i];
num[cnt]++;
bel[i]=cnt;
}
for(int i=1;i<=cnt;i++){
sort(blok[i]+1,blok[i]+num[i]+1);
}
while(m--){
char opt[3];
scanf("%s",opt);
if(opt[0]=='A'){
int l,r;long long w;
scanf("%d%d%lld",&l,&r,&w);
printf("%d\n",query(l,r,w));
}else {
int l,r;long long w;
scanf("%d%d%lld",&l,&r,&w);
add(l,r,w);
}
}
return 0;
}
by GMSD @ 2019-10-09 14:24:32
我也是,不知道哪里错了,自测数据是对的