比赛 20160421x 评测结果 WWWWWWWWWW
题目名称 魔法传输 最终得分 0
用户昵称 asddddd 运行时间 1.133 s
代码语言 C++ 内存使用 7.03 MiB
提交时间 2016-04-21 14:52:02
显示代码纯文本
//
//  main.cpp
//  魔法传输
//
//  Created by Qing Liu on 16/4/21.
//  Copyright © 2016年 Qing Liu. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define mod 1000000007
#define maxn 110000
using namespace std;
typedef long long LL;
LL seg[4*maxn],lazy[4*maxn];
void update(int o){
    seg[o]=seg[o<<1]+seg[o<<1|1];
    seg[o]%=mod;
}
void push_down(int l,int r,int o){
    if (l==r) {
        lazy[o]=0;
        return ;
    }
    LL k=lazy[o];
    k%=mod;
    lazy[o]=0;
    int mid=(l+r)/2;
    seg[o<<1]+=(mid-l+1)*k;
    seg[o<<1|1]+=(r-mid)*k;
    lazy[o<<1]+=k;
    lazy[o<<1|1]+=k;
    return;
}
void addx(int l,int r,int ll,int rr,int o,int x){
    if (ll<=l&&rr>=r) {
        lazy[o]+=x;
        lazy[o]%=mod;
        seg[o]+=x;
        seg[o]%=mod;
        return;
    }
    int mid=(l+r)/2;
    if (ll<=mid) {
        addx(l, mid, ll, rr, o<<1, x);
    }
    if (rr>mid) {
        addx(mid+1, r, ll, rr, o<<1|1, x);
    }
    update(o);
    return;
}
LL query(int l,int r,int ll,int rr,int o){
    if (lazy[o]!=0) {
        push_down(l, r, o);
    }
    if (l>=ll&&r<=rr) {
        return seg[o];
    }
    int mid=(l+r)/2;
    LL ans=0;
    if (ll<=mid) {
        ans+=query(l, mid, ll, rr, o<<1);
    }
    if (rr>mid) {
        ans+=query(mid+1, r, ll, rr, o<<1|1);
    }
    ans%=mod;
    return ans;
}
int main(int argc, const char * argv[]) {
    freopen("magics.in", "r", stdin);
    freopen("magics.out", "w", stdout);
    int n,m;
    cin>>n>>m;
    for (int i=0; i<m; i++) {
        char a;
        cin>>a;
        if (a=='C') {
            int from,to;
            cin>>from>>to;
            addx(0, n-1, from-1, to-1, 1, 1);
        }
        else{
            int u;
            cin>>u;
            cout<<query(0, n-1, 0, u-1, 1)%mod<<endl;
        }
    }
    return 0;
}