#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define re register
#define int ll
#define PII pair<int,int>
#define rep(k,a,b) for (int k = a;k <= b;k++)
#define adde(a,b) v[a].push_back(b)
#define addev(a,b,c) v[a].push_back({b,c});
#define rd read
#define all(a) a.begin(),a.end()
#define mem(a,b) memset(a,b,sizeof a);
#define pb push_back
#define vct vector
#define rev(T) reverse(T.begin(),T.end())
int read()
{
int f=1,k=0;char c = getchar();
while(c <'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();
return k*f;
}
const int N = 1e6+5;
int n,q;
string str;
struct BIT
{
int c[N];
int lb(int x){return x & -x;}
void add(int x,int v)
{
for (int i = x;i <= N-2;i+=lb(i)) c[i] += v;
}
int query(int x)
{
int res = 0;for (int i = x;i;i-=lb(i) ) res += c[i];return res;
}
void mdf(int l,int r,int v)
{
add(l,v);add(r + 1,-v);
}
}bit;
int tag[N];
struct ODT
{
int n;
map<int,int> mp;
ODT(int nn) {mp[1] = 1;mp[nn+1] = -1;n = nn;}
void split(int x)
{
auto it = *prev(mp.upper_bound(x));
mp[x] = it.second;
// cout <<"xit:"<< x << ' ' << it.second << endl;
}
void assign(int l,int r,int v)
{
split(l);
split(r+1);
auto it = (mp.find(l));
while (it->first != r+1) it = mp.erase(it);
mp[l] = v;
}
void perform(int l,int r,int c) //做操作
{
split(l);split(r+1);//先分割區間
auto it = mp.find(l);
while (it->first != r+1)
{
int ql = it->first,qr = next(it)->first-1;
bit.mdf(ql,qr,tag[it->second]);
it = next(it);
}
bit.mdf(l,r,-tag[c]);
}
int query(int x)
{//query 先split
split(x);
return bit.query(x) + tag[mp[x]];
}
};
void solvemain()
{
cin >> n >> q;
ODT odt(n);
while(q--)
{
string str;cin >> str;
if (str[0] == 'C')
{
int l =rd(),r=rd(),c= rd();
odt.perform(l,r,c);
odt.assign(l,r,c);
}
else if (str[0] == 'A')
{
int c =rd(),x =rd();
tag[c] += x;
}
else
{
int id = rd();
printf("%lld\n",odt.query(id));
}
}
}
signed main()
{
int t;t = 1;
while(t--)
{
solvemain();
}
return 0;
}