记录编号 |
414944 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[Tyvj 1518] CPU监控 |
最终得分 |
100 |
用户昵称 |
Hzoi_Mafia |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.316 s |
提交时间 |
2017-06-15 11:54:10 |
内存使用 |
9.85 MiB |
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int inf=1<<31;
inline int read(){
int sum(0),f(1);
char ch(getchar());
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
sum=sum*10+ch-'0';
ch=getchar();
}
return sum*f;
}
int n,m;
int v[100001];
int padd[400001],pset[400001],pmx[400001];
int nadd[400001],nset[400001],nmx[400001];
inline int my_max(int a,int b){
return a>b?a:b;
}
inline void pushup(int i){
int l(i<<1),r(l|1);
pmx[i]=my_max(pmx[l],pmx[r]);
nmx[i]=my_max(nmx[l],nmx[r]);
}
inline void pushdown(int rt){
int ch(rt<<1);
for(int i=0;i<=1;i++){
int nowch(ch+i);
pmx[nowch]=my_max(pmx[nowch],my_max(padd[rt]+nmx[nowch],pset[rt]));
if(nset[rt]==inf){
nmx[nowch]+=nadd[rt];
if(nset[nowch]==inf){
padd[nowch]=my_max(padd[nowch],nadd[nowch]+padd[rt]);
nadd[nowch]+=nadd[rt];
}
else{
pset[nowch]=my_max(pset[nowch],nset[nowch]+padd[rt]);
nset[nowch]=nmx[nowch];
}
}
else{
if(nset[nowch]==inf){
padd[nowch]=my_max(padd[nowch],nadd[nowch]+padd[rt]);
nadd[nowch]+=padd[rt];
}
else
pset[nowch]=my_max(pset[nowch],nmx[nowch]+padd[rt]);
nmx[nowch]=nset[rt];
nset[nowch]=nset[rt];
pset[nowch]=my_max(pset[rt],pset[nowch]);
}
}
nadd[rt]=0;
padd[rt]=0;
nset[rt]=inf;
pset[rt]=inf;
}
inline void build(int l,int r,int i){
padd[i]=0;
pset[i]=inf;
nadd[i]=0;
nset[i]=inf;
if(l==r){
pmx[i]=v[l];
nmx[i]=v[l];
return;
}
int lc(i<<1),rc(lc|1),mid((l+r)>>1);
build(l,mid,lc);
build(mid+1,r,rc);
pushup(i);
}
inline void update_set(int ll,int rr,int c,int l,int r,int i){
if(ll<=l&&r<=rr){
nset[i]=c;
nmx[i]=c;
pset[i]=my_max(pset[i],nset[i]);
pmx[i]=my_max(pmx[i],nmx[i]);
return;
}
pushdown(i);
int lc(i<<1),rc(lc|1),mid((l+r)>>1);
if(ll<=mid)
update_set(ll,rr,c,l,mid,lc);
if(rr>mid)
update_set(ll,rr,c,mid+1,r,rc);
pushup(i);
}
inline void update_add(int ll,int rr,int c,int l,int r,int i){
if(ll<=l&&r<=rr){
nmx[i]+=c;
pmx[i]=my_max(pmx[i],nmx[i]);
if(nset[i]==inf){
nadd[i]+=c;
padd[i]=my_max(padd[i],nadd[i]);
}
else{
nset[i]=nmx[i];
pset[i]=my_max(pset[i],nset[i]);
}
return;
}
pushdown(i);
int lc(i<<1),rc(lc|1),mid((l+r)>>1);
if(ll<=mid)
update_add(ll,rr,c,l,mid,lc);
if(rr>mid)
update_add(ll,rr,c,mid+1,r,rc);
pushup(i);
}
inline int query_p(int ll,int rr,int l,int r,int i){
if(ll<=l&&r<=rr)
return pmx[i];
pushdown(i);
int lc(i<<1),rc(lc|1),mid((l+r)>>1);
int ret(inf);
if(ll<=mid)
ret=my_max(ret,query_p(ll,rr,l,mid,lc));
if(rr>mid)
ret=my_max(ret,query_p(ll,rr,mid+1,r,rc));
return ret;
}
inline int query_n(int ll,int rr,int l,int r,int i){
if(ll<=l&&r<=rr)
return nmx[i];
pushdown(i);
int lc(i<<1),rc(lc|1),mid((l+r)>>1);
int ret(inf);
if(ll<=mid)
ret=my_max(ret,query_n(ll,rr,l,mid,lc));
if(rr>mid)
ret=my_max(ret,query_n(ll,rr,mid+1,r,rc));
return ret;
}
inline void write(int x){
if(x==0){
putchar('0');
return;
}if(x<0)
putchar('-'),x=-x;
int len=0,buf[15];
while(x)
buf[len++]=x%10,x/=10;
for(int i=len-1;i>=0;i--)
putchar(buf[i]+'0');
return;
}
int main(){
freopen("cpuwatcher.in","r",stdin);
freopen("cpuwatcher.out","w",stdout);
n=read();
for(int i=1;i<=n;i++)
v[i]=read();
/*for(int i=1;i<=n;i++)
cout<<v[i]<<' ';*/
build(1,n,1);
m=read();
char op[2];
while(m--){
scanf("%s",op);
if(op[0]=='Q'){
int x(read()),y(read());
write(query_n(x,y,1,n,1));
continue;
}
if(op[0]=='A'){
int x(read()),y(read());
write(query_p(x,y,1,n,1));
continue;
}
if(op[0]=='P'){
int x(read()),y(read()),z(read());
update_add(x,y,z,1,n,1);
continue;
}
if(op[0]=='C'){
int x(read()),y(read()),z(read());
update_set(x,y,z,1,n,1);
continue;
}
}//while(1);
}