线段树0pts求条
查看原帖
线段树0pts求条
941575
Stars_visitor_tyw楼主2024/3/23 17:23
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int tree[N<<2],maxi[N<<2];
int ls(int p)
{
    return p<<1;
}
int rs(int p)
{
    return p<<1|1;
}
void pushup(int cur)
{
    tree[cur]=tree[ls(cur)]+tree[rs(cur)];
    maxi[cur]=max(maxi[ls(cur)],maxi[rs(cur)]);
}
void build(int cur,int qx,int qy)
{
    if(qx==qy)
    {
        cin>>tree[cur];
        maxi[cur]=tree[cur];
        return ;
    }
    int mid=qx+qy>>1;
    build(ls(cur),qx,mid);
    build(rs(cur),mid+1,qy);
    pushup(cur);
}
void update(int cur, int lt, int rt, int qx, int qy)
{
    if(qy<lt||rt<qx)
        return ;
    if(qx==qy)
    {
        tree[cur]=sqrt(tree[cur]);
        maxi[cur]=sqrt(maxi[cur]);
        return ;
    }
    int mid=qx+qy>>1;
    if(lt<=mid&&maxi[ls(cur)]>1)
    {
        update(ls(cur),qx,mid,lt,rt);
    }
    if(rt>mid&&maxi[rs(cur)]>1)
    {
        update(rs(cur),mid+1,qy,lt,rt);
    }
    pushup(cur);
}
int query(int cur,int qx,int qy,int lt,int rt)
{
    if(qy<lt||rt<qx)
    {
        return 0;
    }
    if(lt<=qx&&qy<=rt)
    {
        return tree[cur];
    }
    int mid=qx+qy>>1;
    return query(ls(cur),qx,mid,lt,rt)+query(rs(cur),mid+1,qy,lt,rt);
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    build(1,1,n);
    int q;
    cin>>q;
    while(q--)
    {
        int k,l,r;
        cin>>k>>l>>r;
        if(l>r)
            swap(l,r);
        if(k==0)
        {
            update(1,1,n,l,r);
        }
        else
            cout<<query(1,1,n,l,r)<<"\n";
    }
}
2024/3/23 17:23
加载中...