1 条题解

  • 0
    @ 2026-4-8 18:46:31
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=2e5+10,P=998244353;
    #define lc(p) (p<<1)
    #define rc(p) (p<<1|1)
    struct node{int l,r,s1,s2,s3,tag;}tr[N<<2];
    void mod(int &x){x=(x%P+P)%P;}
    void pushup(int p)
    {
    	tr[p].s1=tr[lc(p)].s1+tr[rc(p)].s1;mod(tr[p].s1);
    	tr[p].s2=tr[lc(p)].s2+tr[rc(p)].s2;mod(tr[p].s2);
    	tr[p].s3=tr[lc(p)].s3+tr[rc(p)].s3;mod(tr[p].s3);
    }
    void pushdown(int p)
    {
    	if(tr[p].tag)
    	{
    		tr[lc(p)].s2+=tr[lc(p)].s1*tr[p].tag;mod(tr[lc(p)].s2);
    		tr[rc(p)].s2+=tr[rc(p)].s1*tr[p].tag;mod(tr[rc(p)].s2);
    		tr[lc(p)].s3+=tr[p].tag*(tr[lc(p)].r-tr[lc(p)].l+1);mod(tr[lc(p)].s3);
    		tr[rc(p)].s3+=tr[p].tag*(tr[rc(p)].r-tr[rc(p)].l+1);mod(tr[rc(p)].s3);
    		tr[lc(p)].tag+=tr[p].tag;tr[rc(p)].tag+=tr[p].tag;mod(tr[lc(p)].tag);mod(tr[rc(p)].tag);
    		tr[p].tag=0;
    	}
    }
    void bt(int p,int l,int r)
    {
    	tr[p].l=l,tr[p].r=r;
    	if(l==r){tr[p].s1=l;return;}
    	int mid=(l+r)>>1;
    	bt(lc(p),l,mid);bt(rc(p),mid+1,r);
    	pushup(p);
    }
    void change(int p,int l,int r,int x)
    {
    	if(tr[p].l>r||tr[p].r<l)return;
    	if(l<=tr[p].l&&tr[p].r<=r)
    	{
    		tr[p].s2+=tr[p].s1*x;mod(tr[p].s2);
    		tr[p].s3+=x*(tr[p].r-tr[p].l+1);mod(tr[p].s3);
    		tr[p].tag+=x;mod(tr[p].tag);
    		return;
    	}
    	pushdown(p);
    	change(lc(p),l,r,x);change(rc(p),l,r,x);
    	pushup(p);
    }
    int query(int p,int l,int r)
    {
    	if(tr[p].l>r||tr[p].r<l)return 0;
    	if(l<=tr[p].l&&tr[p].r<=r)return tr[p].s2;
    	pushdown(p);
    	int ans=query(lc(p),l,r)+query(rc(p),l,r);mod(ans);
    	return ans;
    }
    int query1(int p,int l,int r)
    {
    	if(tr[p].l>r||tr[p].r<l)return 0;
    	if(l<=tr[p].l&&tr[p].r<=r)return tr[p].s3;
    	pushdown(p);
    	int ans=query1(lc(p),l,r)+query1(rc(p),l,r);mod(ans);
    	return ans;
    }
    int a[N];
    signed main()
    {
    	int n,q;cin>>n>>q;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	bt(1,1,n);
    	for(int i=1;i<=n;i++)change(1,i,n,a[i]);
    	for(int i=1;i<=q;i++)
    	{
    		int op;cin>>op;
    		if(op==1)
    		{
    			int x,k;cin>>x>>k;
    			int sum=k-a[x];
    			change(1,x,n,sum);
    			a[x]=k;
    		}
    		else
    		{
    			int x;cin>>x;
    			int sum=query(1,1,x),sum1=query1(1,1,x);
    			int ans=sum1*(x+1)%P-sum;mod(ans);
    			cout<<ans<<'\n';
    		}
    	}
    	return 0;
    }
    • 1

    [ABC256F] Cumulative Cumulative Cumulative Sum

    信息

    ID
    9981
    时间
    2000ms
    内存
    1024MiB
    难度
    9
    标签
    递交数
    13
    已通过
    3
    上传者