记录编号 408924 评测结果 AAAAAAAAAA
题目名称 [Tyvj 1518] CPU监控 最终得分 100
用户昵称 Gravatarrewine 是否通过 通过
代码语言 C++ 运行时间 0.382 s
提交时间 2017-05-26 10:12:46 内存使用 11.76 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
 
using namespace std;
 
typedef long long LL;
 
void read(int &x) {
    char c; bool flag = 0;
    while((c=getchar())<'0'||c>'9') if(c=='-') flag = 1;
    x=c-'0';while((c=getchar())>='0'&&c<='9') x=x*10+c-'0';
    if(flag) x = -x;
}

void upval(int &a,const int &b) {if(b > a) a = b;}

#define inf 2147483646
#define N 500000
int n,x,y,z,E;

#define L o<<1
#define R o<<1|1
#define lch l,mid,o<<1
#define rch mid+1,r,o<<1|1

struct Node {
	int mv,addv,setv;
	int lmv,ladd,lset;
	void Add (int v) {  // 先push_down 
		mv += v;
		if(mv > lmv) lmv = mv;
		addv += v; 
		upval(ladd,addv);
	}
	void Set(int v) {
		mv = v;
		if(v > lmv) lmv = mv;
		setv = v; 
		upval(lset,setv);
	}
}t[N];

void up(int o) {
	t[o].mv = max(t[L].mv,t[R].mv);
	t[o].lmv = max(t[L].lmv,t[R].lmv);
}

void push_down(int o,int p) {  // stv,addv不同时出现 
	    
	    upval(t[p].lmv,max(t[o].lset,t[p].mv+t[o].ladd));
		if(t[p].setv == -inf) upval(t[p].ladd,t[o].ladd+t[p].addv); ///!!!!
		else upval(t[p].lset,t[p].setv+t[o].ladd);
	    
		if(t[o].addv) {
		    if(t[p].setv == -inf) t[p].addv += t[o].addv;
		    else t[p].setv += t[o].addv;
			t[p].mv += t[o].addv;
		}
		
		if(t[o].setv != -inf) {
			t[p].mv = t[p].setv = t[o].setv;
			t[p].addv = 0;
		}
		
		upval(t[p].lset,max(t[p].setv,t[o].lset));
		upval(t[p].ladd,t[p].addv);
		upval(t[p].lmv,t[p].mv);
}

void push_down(int o) {
	push_down(o,o<<1); push_down(o,o<<1|1);
	t[o].addv = t[o].ladd = 0;
	t[o].setv = t[o].lset = -inf;
}

void build(int l,int r,int o) {
	t[o].lset = t[o].setv = -inf;
	if(l == r) {
		read(t[o].mv); t[o].lmv = t[o].mv;
		return; 
	}
	int mid = (l+r)>>1;
	build(lch); build(rch); 
	up(o);
}

int Max(int l,int r,int o) {
	if(l < r) 	push_down(o);
	if(x <= l && r <= y) return t[o].mv;
	int tmp = -inf,mid = (l+r)>>1;
	if(x <= mid) tmp = Max(lch);
	if(y > mid) tmp = max(tmp,Max(rch)); up(o);
	return tmp;
}

int LMax(int l,int r,int o) {
	if(l < r) 	push_down(o);
	if(x <= l && r <= y) return t[o].lmv;
	int tmp = -inf,mid = (l+r)>>1;
	if(x <= mid) tmp = LMax(lch);
	if(y > mid) tmp = max(tmp,LMax(rch));up(o);
	return tmp;
}

void Add(int l,int r,int o) {
	if(l < r) 	push_down(o);
	if(x <= l && r <= y) {t[o].Add(z);return;}
    int mid = (l+r)>>1;
	if(x <= mid) Add(lch);
	if(y > mid) Add(rch);
	up(o);
}

void Set(int l,int r,int o) {
	if(l < r) 	push_down(o);
	if(x <= l && r <= y) {t[o].Set(z);return;}
    int mid = (l+r)>>1;
	if(x <= mid) Set(lch);
	if(y > mid) Set(rch);
	up(o);
}

int main() {
	freopen("cpuwatcher.in","r",stdin); freopen("cpuwatcher.out","w",stdout);
    read(n); build(1,n,1);
    read(E);
    for (int i = 1; i <= E; i++) {
    	char c;while((c=getchar())<'A'||c>'Z');
    	read(x); read(y); if(c=='P' || c=='C') read(z);
    	if(c == 'Q') printf("%d\n",Max(1,n,1));
    	else if(c == 'A') printf("%d\n",LMax(1,n,1));
    	else if(c == 'P') Add(1,n,1);
    	else Set(1,n,1);
	}
    return 0;
}