线段树TLE40pts求助
查看原帖
线段树TLE40pts求助
537998
lpx2024楼主2024/1/20 11:25
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxN=400010;
int l[maxN],r[maxN],a[maxN],c[maxN];
bool tag[maxN];
int len(int k){
    return r[k]-l[k]+1;
}
void pushup(int k){
    c[k]=c[k*2]+c[k*2+1];
    tag[k] = tag[k]&tag[k*2+1];
}
void build(int x,int y,int k){
    l[k]=x,r[k]=y;
    if(x==y){
        c[k]=a[x];
        return;
    }
    int mid=(x+y)/2;
    build(x,mid,k*2);
    build(mid+1,y,k*2+1);
    pushup(k);
}
void update(int x,int y,int k){
    if(tag[k])return;
    if(l[k] == r[k]){
        c[k]= sqrt(c[k]);
        if(c[k] == 1)tag[k]=1;
        return;
    }
    int mid=(l[k]+r[k])/2;
    if(x<=mid) update(x,y,k*2);
    if(y>mid) update(x,y,k*2+1);
    pushup(k);
}
int query(int x,int y,int k){
    if(x<=l[k] && r[k]<=y) return c[k];
    int mid=(l[k]+r[k])/2,ans=0;
    if(x<=mid) ans+=query(x,y,k*2);
    if(y>mid) ans+=query(x,y,k*2+1);
    return ans;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    long long n,m;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,n,1);
    cin>>m;
    for(int i=1;i<=m;i++){
        int op,x,y;
        cin>>op>>x>>y;
        if(x>y)swap(x,y);
        if(op==1) cout<<query(x,y,1)<<"\n";
        else update(x,y,1);
    }
    return 0;
}
2024/1/20 11:25
加载中...