RT,以下代码开任何优化(-O1,O2,O3,Ofast)都能AC,但不开就是不行。
有谁能提供一下没有优化就 AC 的代码吗? /kk
#include <cstdio>
#include <algorithm>
#include <cctype>
#define fo(i_,j_,k_) for(int i_=j_;i_<=k_;++i_)
#define fr(i_,j_,k_) for(int i_=j_;i_>=k_;--i_)
#define rg register
#define rtn return
#define il inline
using namespace std;
typedef long long ll;
const int kMaxn = 50050,len = 305;
int id[kMaxn],a[kMaxn],b[kMaxn],n;
int blo[205][len+5],ptr[205];
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<8,stdin),p1==p2)?EOF:*p1++)
char buf[1<<8],*p1=buf,*p2=buf;
inline int read(void)
{
char c=getchar();int x=0;bool f=0;
for(;!isdigit(c);c=getchar())f^=!(c^45);
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
if(f)x=-x;
rtn x;
}
il void Initalize(void)
{
fo(i,1,n)
{
id[i] = (i-1) / len + 1;
blo[id[i]][ptr[id[i]]++] = a[i];
}
fo(i,1,id[n])sort(blo[i],blo[i]+ptr[i]);
}
il void Resort(int id)
{
ptr[id] = 0;
int _end = min(id*len,n);
fo(i,(id-1)*len+1,_end)
blo[id][ptr[id]++] = a[i];
sort(blo[id],blo[id]+ptr[id]);
}
void Add(int l,int r,int delta)
{
int sid = id[l],eid = id[r];
if(sid==eid)
{
fo(i,l,r)
a[i] += delta;
Resort(sid);
rtn;
}
for(int i=l;id[i]==sid;++i)a[i]+=delta;
Resort(sid);
for(int i=sid+1;i<eid;++i) b[i]+=delta;
for(int i=r;id[i]==eid;--i)a[i]+=delta;
Resort(eid);
}
int Query(int l,int r,int delta)
{
int sid = id[l],eid = id[r],cnt = 0;
if(sid == eid)
{
fo(i,l,r)
if(a[i]+b[sid] < delta)
++cnt;
rtn cnt;
}
for(int i=l;id[i]==sid;++i)
if(a[i]+b[sid] < delta)
++cnt;
for(int i=sid+1;i<eid;++i)
cnt += lower_bound(blo[i],blo[i]+ptr[i],delta-b[i]) - blo[i];
for(int i=r;id[i]==eid;--i)
if(a[i]+b[eid] < delta)
++cnt;
rtn cnt;
}
int main()
{
n=read();
fo(i,1,n)a[i]=read();
Initalize();
fo(i,1,n)
{
int opt,l,r,c;
opt=read(),l=read(),r=read(),c=read();
if(!opt)Add(l,r,c);
else printf("%d\n",Query(l,r,c*c));
}
rtn 0;
}