gss4

#include<bits/stdc++.h>
#define N 100005
#define ll long long
using namespace std;
int n;
ll a[N];
struct Tree{
    int l,r;
    ll sm;
    int flg;
}tre[N<<2];
void pushup(int rt)
{
    tre[rt].sm=tre[rt<<1].sm+tre[rt<<1|1].sm;
    tre[rt].flg=tre[rt<<1].flg & tre[rt<<1|1].flg ;
}
void build(int rt,int L,int R)
{
    tre[rt].l=L;
    tre[rt].r=R;
    if(L==R)
    {
        tre[rt].sm=a[L];
        if(a[L]==0 || a[L]==1) tre[rt].flg=1;
        return ;
    }
    int mid=(L+R)>>1;//習慣性地寫成了(tre[rt].l+tre[rt].r)>>1
    build(rt<<1,L,mid);
    build(rt<<1|1,mid+1,R);
    pushup(rt);
}
void update(int rt,int L,int R)
{
    if(tre[rt].flg==1) return;//如果是1就不改了
    if(tre[rt].l==tre[rt].r)
    {
        tre[rt].sm=1ll*sqrt(tre[rt].sm);
        if(tre[rt].sm==1) tre[rt].flg=1;
        return;
    }
    int mid=(tre[rt].l+tre[rt].r)>>1;
    if(L<=mid)
        update(rt<<1,L,R);
    if(R>mid)
        update(rt<<1|1,L,R);
    pushup(rt);
}
ll query(int rt,int L,int R)
{
    if(L<=tre[rt].l && R>=tre[rt].r)
        return tre[rt].sm;
    int mid=(tre[rt].l+tre[rt].r)>>1;
    ll sum=0;
    if(L<=mid)
        sum=query(rt<<1,L,R);
    if(R>mid)
        sum+=query(rt<<1|1,L,R);
    return sum;
}
int m,z,x,y,cas;
int main()
{
    while(~scanf("%d",&n))
    {
        printf("Case #%d:\n",++cas);
        for(int i=1;i<=(n<<2);i++)
            tre[i].flg=0;
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]);/////   這裏沒有寫longlong
        build(1,1,n);
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&z,&x,&y);
            if(x>y)swap(x,y);
            if(z==0)//modify
            {
                update(1,x,y);
            }
            else
                printf("%lld\n",query(1,x,y));
        }
        printf("\n");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章