結果
問題 |
No.2640 traO Stamps
|
ユーザー |
|
提出日時 | 2024-02-19 21:54:25 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 223 ms / 2,000 ms |
コード長 | 2,487 bytes |
コンパイル時間 | 2,402 ms |
コンパイル使用メモリ | 207,440 KB |
最終ジャッジ日時 | 2025-02-19 16:56:25 |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 33 |
ソースコード
#include <bits/stdc++.h> using namespace std; using SS = long long; class SegmentTree{ public: int siz = 1; vector<SS> dat; SS op(SS a, SS b){return a+b;} SS e(){return 0;} void renew (SS &a,SS x){ //a = op(a,x); a = x; //その他. } void make(int N){ while(siz < N) siz *= 2; dat.resize(siz*2,e()); } void make2(int N,vector<SS> &A){ make(N); for(int i=0; i<N; i++){ int pos = i+siz-1; dat.at(pos) = A.at(i); } for(int i=siz-2; i>=0; i--) dat.at(i) = op(dat.at(i*2+1),dat.at(i*2+2)); } void update(int pos,SS x){ pos = pos+siz-1; renew(dat.at(pos),x); while(pos != 0){ pos = (pos-1)/2; dat.at(pos) = op(dat.at(pos*2+1),dat.at(pos*2+2)); } } SS findans(int L, int R, int a, int b, int u){ if(R <= a || b <= L) return e(); if(L <= a && b <= R) return dat.at(u); return op(findans(L,R,a,(a+b)/2,u*2+1),findans(L,R,(a+b)/2,b,u*2+2)); } SS get(int pos){return dat.at(pos+siz-1);} SS rangeans(int l, int r){return findans(l,r,0,siz,0);} SS allrange(){return findans(0,siz,0,siz,0);} //ノーマルセグ木 二分探索は実装してない. }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int N,M,K; cin >> N >> M >> K; vector<int> S(K+1); for(auto &s : S) cin >> s,s--; long long inf = 1e18; vector<vector<long long>> dist(N,vector<long long>(N,inf)); for(int i=0; i<M; i++){ int u,v; cin >> u >> v; u--; v--; int w; cin >> w; dist.at(u).at(v) = w; dist.at(v).at(u) = w; } for(int i=0; i<N; i++) dist.at(i).at(i) = 0; for(int l=0; l<N; l++){ for(int i=0; i<N; i++) for(int k=0; k<N; k++){ dist.at(i).at(k) = min(dist.at(i).at(k),dist.at(i).at(l)+dist.at(l).at(k)); } } vector<long long> time(K); for(int i=0; i<K; i++){ int u = S.at(i),v = S.at(i+1); time.at(i) = dist.at(u).at(v); } SegmentTree Z; Z.make2(K,time); int Q; cin >> Q; while(Q--){ int t,x,y; cin >> t >> x >> y; if(t == 1){ y--; if(x) Z.update(x-1,dist.at(S.at(x-1)).at(y)); if(x != K) Z.update(x,dist.at(y).at(S.at(x+1))); S.at(x) = y; } if(t == 2) cout << Z.rangeans(x,y) << endl; } }