动点线段树 60 WA
查看原帖
动点线段树 60 WA
374433
ppip嘟嘟嘟楼主2022/5/26 19:45
#include <bits/stdc++.h>
using namespace std;
struct tnode
{
    tnode *l,*r;
    int cnt;
};
using pnode=tnode*;
pnode nil{new tnode{nil,nil,0}};
void check(pnode& p){if(p==nil)p=new tnode{nil,nil,0};}
void modify(pnode& p,int k,int v,int cnt)
{
    check(p);
    p->cnt+=v;
    if (cnt==1) return;
    int cq{cnt>>1};
    if (k<=cq) modify(p->l,k,v,cq);
    else modify(p->r,k-cq,v,cnt-cq);
}
int query(pnode p,int k,int L,int R)
{
    if (p->cnt==0||R<=k) return p->cnt;
    int mid{L+R>>1};
    if (k<=mid) return query(p->l,k,L,mid);
    else return p->l->cnt+query(p->r,k,mid,R);
}
int main()
{
    int n,m;
	cin>>n>>m;
	int t,x,y;pnode rt{nil};
	for (int i{1};i<=n;++i)
    {
        scanf("%d",&t);
        modify(rt,i,t,n);
    }
	while (m--)
	{
		scanf("%d %d %d",&t,&x,&y);
		switch(t)
		{
		case 1:
			modify(rt,x,y,n);
			break;
		case 2:
			printf("%d\n",query(rt,y+1,1,n+1)-query(rt,x,1,n+1));
			break;
		}
	}
	return 0;
}
2022/5/26 19:45
加载中...