ABC的D题线段树求助,7个TLE
  • 板块学术版
  • 楼主tanghg
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/11/19 21:40
  • 上次更新2023/10/27 02:18:11
查看原帖
ABC的D题线段树求助,7个TLE
692647
tanghg楼主2022/11/19 21:40

QWQ

#include<cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const ll MAXN=1e5+5;
ll w[MAXN*200],a[MAXN],n,q;
inline ll ls(ll u){return u<<1;}
inline ll rs(ll u){return u<<1|1;}
void push_back(const ll u){w[u]=w[ls(u)]+w[rs(u)];}
void build(ll u,ll l,ll r){
    if(l==r){
        w[u]=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(ls(u),l,mid);
    build(rs(u),mid+1,r);
    push_back(u);
}
void op1(ll u,ll l,ll r,ll x){
    if(l==r){
        w[u]=x;
    }else{
        ll mid=(l+r)>>1;
        op1(ls(u),l,mid,x);
        op1(rs(u),mid+1,r,x);
        w[u]=w[ls(u)]+w[rs(u)];
    }
}
void op2(ll u,ll l,ll r,ll num,ll x){
    if(l==r){
        w[u]+=x;
    }else{
        ll mid=(l+r)>>1;
        if(mid>=num){
            op2(ls(u),l,mid,num,x);
        }else{
            op2(rs(u),mid+1,r,num,x);
        }
        push_back(u);
    }
}
ll op3(ll u, ll l, ll r, ll num){
    if(l==r){
        return w[u];
    }else{
        ll mid=(l+r)>>1;
        if(mid>=num){
            return op3(ls(u),l,mid,num);
        }else{
            return op3(rs(u),mid+1,r,num);
        }
    }
}
int main(){
    cin>>n;
    for (int i = 1; i <=n ; ++i) {
        cin>>a[i];
    }
    build(1,1,n);
    //test(1,1,n);
    cin>>q;
    for (int i = 1; i <=q ; ++i) {
        ll op,x,y;
        cin>>op;
        if(op==1){
            cin>>x;
            op1(1,1,n,x);
            //test(1,1,n);
        }else if(op==2){
            cin>>x>>y;
            op2(1,1,n,x,y);
//            test(1,1,n);
//            cout<<endl;
        }else{
            cin>>x;
            cout<<op3(1,1,n,x)<<"\n";
        }
    }
    return 0;
}
2022/11/19 21:40
加载中...