数据结构--线段树

[题目链接] (https://codeforc.es/contest/498/problem/D)
普通线段树题目,维护t时刻到达该点的信息。

#include<bits/stdc++.h>
#define m (l+r)/2
#define ls o*2
#define rs o *2+1
using namespace std;
const int maxn = 1e5+10;
int tr[maxn*4][60] , n ;
void build(int o,int l,int r)
{
    if(l==r)
    {
        int a;
        scanf("%d",&a);
        for(int i=0;i<60;i++)
        tr[o][i] = 1 + (i%a==0);
        return ;
    }
    build(ls,l,m);
    build(rs,m+1,r);
    for(int i=0;i<60;i++)
    tr[o][i] = tr[ls][i] + tr[rs][(i+tr[ls][i])%60];
}
void up(int o,int l,int r,int p,int v)
{
    if(l==r)
    {
        for(int i=0;i<60;i++)
        tr[o][i] =  1 + (i%v==0);
        return;
    }
    if(p>m) up(rs,m+1,r,p,v);
    else up(ls,l,m,p,v);
    for(int i=0;i<60;i++)
    tr[o][i] = tr[ls][i] + tr[rs][(i+tr[ls][i])%60];
}
int qu(int o,int l,int r,int ql,int qr,int t)
{
    if(ql<=l&&qr>=r)
    return tr[o][t];
    int ans = 0;
    if(ql<=m) ans += qu(ls,l,m,ql,qr,(t+ans)%60);
    if(qr>m) ans += qu(rs,m+1,r,ql,qr,(t+ans)%60);
    return ans ;
}
int main()
{
    scanf("%d",&n);
    build(1,1,n);
    int q;scanf("%d",&q);
    char s;
    int l,r,p,v;
    for(int i=1;i<=q;i++)
    {
        cin>>s;
        if(s=='A'){
         scanf("%d%d",&l,&r);
         printf("%d\n",qu(1,1,n,l,r-1,0));
        }
        if(s=='C'){
        scanf("%d%d",&p,&v);
        up(1,1,n,p,v);
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值