結果
問題 |
No.3265 地元に帰れば天才扱い!
|
ユーザー |
|
提出日時 | 2025-09-06 14:44:55 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,737 ms / 2,500 ms |
コード長 | 2,928 bytes |
コンパイル時間 | 2,779 ms |
コンパイル使用メモリ | 207,708 KB |
実行使用メモリ | 25,504 KB |
最終ジャッジ日時 | 2025-09-06 14:46:03 |
合計ジャッジ時間 | 41,153 ms |
ジャッジサーバーID (参考情報) |
judge / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 21 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; template <typename T> struct ST_SUM{ vector<T>num; int siz; ST_SUM(int n){ int x = 1; while(n > x) x <<= 1; siz = x; num = vector<T> ((x<<1),0LL); } void Update(int x,T i){ x = x + siz - 1; num[x] = i; while(x != 0){ x = (x-1)/2; num[x] = num[x*2 + 1]+num[x*2 + 2]; } } T Sub_Serch(int n,int m,int k,int l,int r){ if(r <= n || m <= l) return 0; if(n <= l && r <= m) return num[k]; k *= 2; T lx = Sub_Serch(n, m, k+1, l, (r+l)/2); T rx = Sub_Serch(n, m, k+2, (l+r)/2, r); return lx + rx; } T Serch(int n,int m){ return Sub_Serch(n, m+1, 0, 0, siz); } }; template <typename T> struct ST_CNT{ vector<T>num; int siz; ST_CNT(int n){ int x = 1; while(n > x) x <<= 1; siz = x; num = vector<T> ((x<<1),0LL); } void sub_update(int n,int m,int k,int l,int r,T x){ if(r <= n || m <= l) return; if(n <= l && r <= m){ num[k] += x; return; } k *= 2; sub_update(n,m,k+1,l,(l+r)/2,x); sub_update(n,m,k+2,(l+r)/2,r,x); return; } void update(int n,int m,T x){ sub_update(n,m+1,0,0,siz,x); return; } T serch(int n){ n += siz-1; T sum = num[n]; while(n != 0){ n = (n-1)/2; sum += num[n]; } return sum; } }; int main(){ int n,m; cin >> n >> m; ST_SUM<ll>sum (m); ST_CNT<ll>cnt (m); vector<vector<int>>rng (n,vector<int>(2)); vector<ll>rate (n),pos (n); for(int i=0;i<n;i++){ ll s,l,r; cin >> s >> l >> r; l--,r--; rng[i][0] = l,rng[i][1] = r; rate[i] = s; pos[i] = i; sum.Update(i,s); cnt.update(l,r,1); } ll ans = 0; for(int i=0;i<n;i++){ ll c = sum.Serch(rng[i][0],rng[i][1]); ll d = rng[i][1] - rng[i][0] + 1; ans += d * rate[i] - c; } int q; cin >> q; for(int i=0;i<q;i++){ int x,y,l,r; cin >> x >> y >> l >> r; x--,y--,l--,r--; ll bc = sum.Serch(rng[x][0],rng[x][1]); ll bd = rng[x][1] - rng[x][0] + 1; ans -= bd * rate[x] - bc; cnt.update(rng[x][0],rng[x][1],-1); ll c = cnt.serch(pos[x]); ans += c * rate[x]; sum.Update(pos[x],0); pos[x] = y; sum.Update(pos[x],rate[x]); ll ac = cnt.serch(pos[x]); ans -= ac * rate[x]; rng[x][0] = l,rng[x][1] = r; ll aac = sum.Serch(l,r); ll aad = r - l + 1; ans += rate[x] * aad - aac; cnt.update(l,r,1); cout << ans << endl; } }