Segment Tree Question TLE on CSES

Правка en1, от this_ability, 2025-08-11 15:38:50

I am still stuck at Salary Queries. Although acc to me I have followed your approach to the answer only, but I am getting TLE on CSES with some test cases getting accepted. I have tried to debug my code but I still feel it should have a T.C. less than 1e8. Can anybody help? (I have used map as well but tle)

include <bits/stdc++.h>

using namespace std;

define ll long long

define endl '\n'

const int onee7 = 10000000; const int hundred = 100; ll int t[4*onee7]={0}; void build(ll int a[], ll int v,ll int tl, ll int tr) { if (tl == tr) { t[v] = a[tl]; } else { ll int tm = (tl + tr) / 2; build(a, v*2, tl, tm); build(a, v*2+1, tm+1, tr); t[v] = t[v*2]+t[v*2+1]; } }

ll int sumi(ll int v, ll int tl, ll int tr, ll int l, ll int r) { if (l > r) return 0ll;//changes if (l == tl && r == tr) { return t[v]; } ll int tm = (tl + tr) / 2; return sumi(v*2, tl, tm, l, min(r, tm))+sumi(v*2+1, tm+1, tr, max(l, tm+1), r); } void update(ll int v, ll int tl, ll int tr, ll int pos, ll int delta) { if (tl == tr) { t[v] += delta; } else { ll int tm = (tl + tr) / 2; if (pos <= tm) update(v*2, tl, tm, pos, delta); else update(v*2+1, tm+1, tr, pos, delta); t[v] = t[v*2] + t[v*2+1]; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); ll int q,n; cin>>n>>q; ll int arr[n+1]; unordered_map<ll int,ll int> umap; umap.reserve(1024); umap.max_load_factor(0.25); for(ll int i=1;i<=n;i++){ cin>>arr[i]; umap[arr[i]]++; t[onee7+(arr[i]%hundred)]++; } for(int i=onee7-1;i>0;--i) t[i]=t[i<<1]+t[i<<1|1];

for(ll int i=0;i<q;i++){
    char x;
    cin>>x;
    if(x=='!'){
        ll int y,z;
        cin>>y>>z;
        umap[arr[y]]--;
        update(1,1,onee7,arr[y]%hundred,-1);
        arr[y]=z;
        umap[z]++;
        update(1,1,onee7,arr[y]%hundred,+1);
    }else{
        ll int y,z;
        cin>>y>>z;
        ll int ans =0;
        if(z-y<=100){
            for(ll int k=y;k<=z;k++) ans+=umap[k];
        }
        else{
            ans+=sumi(1,1,onee7,(y%hundred)+1,(z%hundred)-1);
            for(ll int k = y ; k<((y%100)*100);k++) ans+=umap[k];
            for(ll int k = (z%100)*100;k<=z;k++) ans+=umap[k];
        }
        cout<<ans<<endl;
    }

}
return 0;

}

Теги segment tree, time limit exceeded, help me, cses

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
en2 Английский this_ability 2025-08-11 15:40:49 2526
en1 Английский this_ability 2025-08-11 15:38:50 2645 Initial revision (published)