记录编号 253066 评测结果 AAAAAAAAAA
题目名称 魔法传输 最终得分 100
用户昵称 GravatarFmuckss 是否通过 通过
代码语言 C++ 运行时间 0.815 s
提交时间 2016-04-21 17:14:34 内存使用 15.58 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
const int lcy = 1000000007;
const int maxn = 1e5+10;

int n, m; 

class seg_ment_tree {
private:
	struct node{
		int l, r;
		LL v;
		int lazy;
	}ns[maxn << 3];
public:
	void build(int i, int l, int r) {
		if(l == r) {
			ns[i].l = l;
			ns[i].r = r;
			ns[i].v = 0;
			return;
		}
		ns[i].l = l, ns[i].r = r;
		build(i << 1, l, (l+r) >> 1);
		build(i << 1 | 1, ((l+r) >> 1) + 1, r);
	}
	
	inline void update(int i) {
		if(!ns[i].l) return;
		ns[i].v = ns[i << 1].v + ns[i << 1 | 1].v;
		ns[i].v %= lcy;
	}
	
	inline void make_add(int i, int t) {
		if(!ns[i].l) return;
		ns[i].v += t * (ns[i].r - ns[i].l + 1);
		ns[i].v %= lcy;
		ns[i].lazy += t;
	}
	
	inline void push_down(int i) {
		if(!ns[i].l) return;
		if(ns[i].lazy) {
			make_add(i << 1, ns[i].lazy);
			make_add(i << 1 | 1, ns[i].lazy);
			
			ns[i].lazy = 0;
		}
	}
	
	int query(int i, int l, int r) {
		push_down(i);
		if(ns[i].l == l && ns[i].r == r) { return ns[i].v; }
		else if(r <= ns[i << 1].r) return query(i << 1, l, r);
		else if(l >= ns[i << 1 | 1].l) return query(i << 1 | 1, l, r);
		else if(l <= ns[i << 1].r && r >= ns[i << 1 | 1].l) return (query(i << 1, l, ns[i << 1].r) + 
																	query(i << 1 | 1, ns[i << 1 | 1].l, r)) % lcy;
		update(i);
	}
	
	void change(int i, int l, int r, int t) {
		push_down(i);
		if(ns[i].l == l && ns[i].r == r) { make_add(i, t); return; }
		else if(r <= ns[i << 1].r) change(i << 1, l, r, t);
		else if(l >= ns[i << 1 | 1].l) change(i << 1 | 1, l, r, t);
		else if(l <= ns[i << 1].r && r >= ns[i << 1 | 1].l) change(i << 1, l, ns[i << 1].r, t), 
															change(i << 1 | 1, ns[i << 1 | 1].l, r, t);
		update(i);
	}
}st;

inline char get_han() {
	char tmp = getchar();
	while(tmp != 'C' && tmp != 'Q') tmp = getchar();
	return tmp;
}

inline void solve() {
	scanf("%d %d", &n, &m);
	st.build(1, 1, n+1);
	int l, r;
	char han;
	for(int i = 1; i <= m; i++) {
		han = get_han();
		if(han == 'Q') {
			scanf("%d", &r);
			printf("%d\n", st.query(1, 1, r));
		} else {
			scanf("%d %d", &l, &r);
			st.change(1, l, r, 1);
			st.change(1, r+1, r+1, -(r-l+1)); 
		}
	}
}

int main() {
	freopen("magics.in", "r", stdin);
	freopen("magics.out", "w", stdout);
	solve();
	return 0;
}