比赛 cdcqの省选膜你赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 新史「新幻想史 -现代史-」 最终得分 100
用户昵称 __stdcall 运行时间 1.445 s
代码语言 C++ 内存使用 9.09 MiB
提交时间 2017-04-11 20:38:46
显示代码纯文本
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;
typedef long long ll;

int n, m;

namespace Solve1 {
	const int MAXN = 503, MAXM = 503;
    
	ll a[MAXM][MAXN];

	void do_Q() {
		int x, y, z;
		scanf( "%d%d%d", &x, &y, &z );
		ll ans = 0;
		for( int i = x; i <= y; ++i ) ans += a[z][i];
		printf( "%lld\n", ans );
	}
	void do_M( int now ) {
		int x, y, z, l, r, v, t;
		scanf( "%d%d%d%d%d%d%d", &x, &y, &z, &l, &r, &v, &t );
		for( int i = t; i <= now; ++i ) {
			for( int j = x; j <= y; ++j ) a[i][j] -= z;
			for( int j = l; j <= r; ++j ) a[i][j] += v;
		}
	}
	void solve() {
		for( int i = 1; i <= n; ++i ) scanf( "%lld", &a[0][i] );
		for( int t = 1; t <= m; ++t ) {
			for( int i = 1; i <= n; ++i ) a[t][i] = a[t-1][i];
			char c; scanf( " %c", &c );
			if( c == 'Q' ) do_Q();
			else do_M(t);
		}
	}
}

namespace BIT {
	const int MAXN = 50010;
	inline int lowbit( int x ) {
		return x&(-x);
	}
    ll d[MAXN] = {0}, d2[MAXN] = {0};
	void add( int x, int v ) {
		for( int i = x; i <= n; i += lowbit(i) ) {
			d[i] += v;
			d2[i] += (ll)x*v;
		}
	}
	void add( int l, int r, int v ) {
		add(l,v), add(r+1,-v);
	}
	ll query( int x ) {
		ll sum = 0;
		for( int i = x; i; i -= lowbit(i) )
			sum += (x+1)*d[i] - d2[i];
		return sum;
	}
	ll query( int l, int r ) {
		return query(r) - query(l-1);
	}
	void clear( int x ) {
		for( ; x <= n; x += lowbit(x) )
			d[x] = d2[x] = 0;
	}
	void clear( int l, int r ) {
		clear(l), clear(r+1);
	}
}

namespace Solve2 {
	const int MAXN = 50010, MAXM = 50010;
	const int MAXQ = MAXN + MAXM*2;
	
	struct Query {
		int tm, tp, l, r, v;
		Query(){}
		Query( int tm, int tp, int l, int r, int v ):
			tm(tm),tp(tp),l(l),r(r),v(v){}
		bool operator<( const Query &rhs ) const {
			if( tm == rhs.tm ) return tp < rhs.tp;
			else return tm < rhs.tm;
		}
	};
	Query qy[MAXQ];
	ll ans[MAXN];
	int qidx = 0, aidx = 0;

	Query tmp[MAXQ];
	void cdq( int L, int R ) {
		if( R-L <= 1 ) return;
		int M = (L+R)>>1;
		cdq(L,M), cdq(M,R);
		int p = L, q = M, o = L;
		while( p < M && q < R ) {
			if( qy[p] < qy[q] ) {
				if( qy[p].tp == 0 )
					BIT::add(qy[p].l, qy[p].r, qy[p].v);
				tmp[o++] = qy[p++];
			} else {
				if( qy[q].tp == 1 )
					ans[qy[q].v] += BIT::query(qy[q].l, qy[q].r);
				tmp[o++] = qy[q++];
			}
		}
		while( p < M ) tmp[o++] = qy[p++];
		while( q < R ) {
			if( qy[q].tp == 1 )
				ans[qy[q].v] += BIT::query(qy[q].l, qy[q].r);
			tmp[o++] = qy[q++];
		}
		for( int i = L; i < R; ++i ) {
			qy[i] = tmp[i];
			if( qy[i].tp == 0 ) {
				BIT::clear(qy[i].l, qy[i].r);
			}
		}
	}
	
	void solve() {
		for( int i = 1; i <= n; ++i ) {
			int a; scanf( "%d", &a );
			qy[qidx++] = Query(0,0,i,i,a);
		}
		while( m-- ) {
			char ch; scanf( " %c", &ch );
			if( ch == 'Q' ) {
				int x, y, z;
				scanf( "%d%d%d", &x, &y, &z );
				qy[qidx++] = Query(z,1,x,y,aidx++);
			} else {
				int x, y, z, l, r, v, t;
				scanf( "%d%d%d%d%d%d%d", &x, &y, &z, &l, &r, &v, &t );
				qy[qidx++] = Query(t,0,x,y,-z);
				qy[qidx++] = Query(t,0,l,r,v);
			}
		}
		cdq(0,qidx);
		for( int i = 0; i < aidx; ++i ) printf( "%lld\n", ans[i] );
	}
}

int main() {
	freopen( "cdcq_a.in", "r", stdin );
	freopen( "cdcq_a.out", "w", stdout );
	scanf( "%d%d", &n, &m );
	if( n <= 500 && m <= 500 ) Solve1::solve();
	else Solve2::solve();
	return 0;
}