算法随笔——ODT

#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;
}
posted @ 2025-07-24 09:06  codwarm  阅读(13)  评论(0)    收藏  举报