結果
問題 | No.2101 [Cherry Alpha N] ずっとこの数列だったらいいのに |
ユーザー | momoyuu |
提出日時 | 2022-10-15 00:28:55 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 518 ms / 6,000 ms |
コード長 | 2,487 bytes |
コンパイル時間 | 2,996 ms |
コンパイル使用メモリ | 259,708 KB |
実行使用メモリ | 30,812 KB |
最終ジャッジ日時 | 2024-06-26 18:32:30 |
合計ジャッジ時間 | 24,123 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 42 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; using ull = unsigned long long; using ld = long double; template<class t> using vc = vector<t>; template<class t> using vvc = vc<vc<t>>; using pi = pair<int,int>; using pl = pair<ll,ll>; using vi = vc<int>; using vvi = vvc<int>; using vl = vc<ll>; using vvl = vvc<ll>; #define rep(i,a,b) for (int i = (int)(a); i < (int)(b); i++) #define irep(i,a,b) for (int i = (int)(a); i > (int)(b); i--) #define all(a) a.begin(),a.end() #define print(n) cout << n << '\n' #define pritn(n) print(n) #define printv(n,a) {copy(all(n),ostream_iterator<a>(cout," ")); cout<<"\n";} #define printvv(n,a) {for(auto itr:n) printv(itr,a);} #define rup(a,b) (a+b-1)/b #define input(A,N) rep(i,0,N) cin>>A[i] #define chmax(a,b) a = max(a,b) #define chmin(a,b) a = min(a,b) template< typename T > struct BIT{ int n; vector<T> data; BIT(int n):n(n),data(n+1,0){} void add(int i,T x){ i++; while(i<=n){ data[i] += x; i += i & (-i); } } //sum of [l,r) T sum(int l,int r){ return sum(r-1)-sum(l-1); } T sum(int i){ i++; T now = 0; while(i>0){ now += data[i]; i -= i & (-i); } return now; } }; int main(){ cout << fixed << setprecision(15); int n; cin>>n; BIT<ll> b1(n),b2(n); using pp = pair<ll,pair<int,int>>; vc<pp> dd; vl a(n); vl t(n); rep(i,0,n){ cin>>a[i]>>t[i]; b1.add(i,a[i]); dd.emplace_back(t[i]-1,pi(0,i)); dd.emplace_back(t[i]+a[i]-1,pi(1,i)); } int q; cin>>q; vl tt(q),l(q),r(q); rep(i,0,q){ cin>>tt[i]>>l[i]>>r[i]; l[i]--; dd.emplace_back(tt[i],pi(2,i)); } sort(all(dd)); vl ans(q); //a[i] - (nt - t[i] + 1) rep(i,0,dd.size()){ pp now = dd[i]; int qq = now.second.first; ll nn = now.first; int ni = now.second.second; //cout<<ni<<" "<<nn<<" "<<qq<<endl; if(qq==0){ b1.add(ni,nn); b2.add(ni,-1); }else if(qq==1){ b1.add(ni,-(nn-a[ni])); b1.add(ni,-a[ni]); b2.add(ni,1); }else{ //cout<<l[ni]<<" "<<r[ni]<<endl; ll sum = b1.sum(l[ni],r[ni]) + nn*b2.sum(l[ni],r[ni]); ans[ni] = sum; } } rep(i,0,q) print(ans[i]); //system("pause"); return 0; }