描述
初始时,火车上没有学生;当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。年级主任走到第m节车厢时,他想知道第1到m这m节车厢上一共有多少学生,但是他没有调头往回走的习惯.也就是说每次当他提问时,m总会比前一次大。
格式
输入格式
第一行两个整数n,k,表示火车共有n节车厢以及k个事件。接下来有k行,按时间先后给出k个事件,每行开头都有一个字母A,B或C,如果字母为A,接下来是一个数m,表示年级主任现在在第m节车厢;如果为B,接下来两个数m,p,表示在第m节车厢有p名学生上车;如果为C,接下来两个数m,p,表示在第m节车厢有p名学生下车。学生总人数不会超过100000。
输出格式
有多少个A就输出多少行,每行一个整数,回答年级主任提出的问题。
样例1
样例输入1
10 7
A 1
B 1 1
B 3 1
B 4 1
A 2
A 3
A 10
样例输出1
0
1
2
3
限制
各个测试点1s
解析:
树状数组裸题。。。
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=500010;
int n,m,k;
int sum[Max];
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') {f=-1;c=getchar();}
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline int lowbit(int x){return x&-x;}
inline void add(int pos,int x){for(;pos<=n;pos+=lowbit(pos)) sum[pos]+=x;}
inline int Q(int pos)
{
int ans=0;
for(;pos;pos-=lowbit(pos)) ans+=sum[pos];
return ans;
}
int main()
{
n=get_int(),m=get_int();
for(int i=1;i<=m;i++)
{
char ch=getchar();
if(ch == 'A')
{
int x=get_int();
cout<<Q(x)<<"\n";
}
else
{
int x=get_int(),y=get_int();
if(ch == 'B') add(x,y);
else add(x,-y);
}
}
return 0;
}