记录编号 323517 评测结果 AAAAAAAAAA
题目名称 魔法传输 最终得分 100
用户昵称 Gravatarasddddd 是否通过 通过
代码语言 C++ 运行时间 0.956 s
提交时间 2016-10-16 19:05:22 内存使用 3.75 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#define maxn 100100
using namespace std;
int seg[4*maxn],lazy[4*maxn],mark[maxn];
int n,m;
void push_down(int l,int r,int o){
	int k=lazy[o];
	lazy[o]=0;
	if(l==r)
	return;
	int mid=(l+r)/2;
	lazy[o<<1]+=k;
	lazy[o<<1|1]+=k;
	seg[o<<1]+=k*(mid-l+1);
	seg[o<<1|1]+=k*(r-mid);
	return ;
} 
void change(int x,int l,int r,int o,int ll,int rr){
	if(l>=ll&&r<=rr){
		lazy[o]+=x;
		seg[o]+=x*(r-l+1);
		return ;
	}
	if(lazy[o]!=0){
		push_down(l,r,o);
	}
	int mid=(l+r)/2;
	if(ll<=mid){
		change(x,l,mid,o<<1,ll,rr);
	}
	if(rr>mid){
		change(x,mid+1,r,o<<1|1,ll,rr);
	}
	seg[o]=seg[o<<1|1]+seg[o<<1];
	return;
}
int query(int l,int r,int o,int ll,int rr){
	if(l>=ll&&r<=rr){
		return seg[o];
	}
	if(lazy[o]!=0){
		push_down(l,r,o);
	}
	int mid=(l+r)/2;
	int anss=0;
	if(ll<=mid){
		anss+=query(l,mid,o<<1,ll,rr);
	}
	if(rr>mid){
		anss+=query(mid+1,r,o<<1|1,ll,rr);
	}
	seg[o]=seg[o<<1]+seg[o<<1|1];
	return anss;
}
void get_input(){
	cin>>n>>m;
	//build(0,n-1,1);
	for(int i=0;i<m;i++){
		int a;
		char t;
		cin>>t>>a;
		if(t=='Q'){ 
			cout<<query(0,n-1,1,0,a-1)<<endl;
		}
		else{
			int temp;
			cin>>temp;
			change(1,0,n-1,1,a-1,temp-1);
			if(temp!=n)
			change(-(temp-a+1),0,n-1,1,temp,temp);
		}
	}
}
int main(){
	freopen("magics.in","r",stdin);
	freopen("magics.out","w",stdout);
	get_input();
}