結果
問題 | No.2640 traO Stamps |
ユーザー |
|
提出日時 | 2024-02-19 21:59:45 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 92 ms / 2,000 ms |
コード長 | 2,747 bytes |
コンパイル時間 | 933 ms |
コンパイル使用メモリ | 83,480 KB |
最終ジャッジ日時 | 2025-02-19 16:58:40 |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 33 |
ソースコード
#include<iostream>#include<algorithm>#include<vector>#include<cassert>using namespace std;using ll=long long;#define all(v) v.begin(),v.end()#define rall(v) v.rbegin(),v.rend()template<class T> bool chmax(T &a, T b){if (a < b){a = b;return true;} else return false;}template<class T> bool chmin(T &a, T b){if (a > b){a = b;return true;} else return false;}template <typename M>struct segment_tree {using T = typename M::T;public:explicit segment_tree(int N) : segment_tree(std::vector<T>(N, M::e())) {}explicit segment_tree(const std::vector<T>& v) {int N = (int)v.size();n = N;size = 1;while (size < N) size <<= 1;data.resize(2 * size, M::e());for (int i = 0; i < N; i++) data[size + i] = v[i];for (int i = size - 1; i >= 1; i--) update(i);};void set(int p, T x) {assert(0 <= p && p < n);p += size;data[p] = x;while (p > 1) {p >>= 1;update(p);}}T get(int p) {assert(0 <= p && p < n);p += size;return data[p];}T prod(int l, int r) {assert(0 <= l && l <= r && r <= n);T vl = M::e(), vr = M::e();l += size;r += size;while (l < r) {if (l & 1) vl = M::op(vl, data[l++]);if (r & 1) vr = M::op(data[--r], vr);l >>= 1;r >>= 1;}return M::op(vl, vr);}T all_prod() { return data[1]; }private:int n, size;std::vector<T> data;void update(int p) { data[p] = M::op(data[2 * p], data[2 * p + 1]); }};struct Monoid{using T=ll;static T op(T l,T r){return l+r;}static T e(){return 0;}};const ll INF=1LL<<60;int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int N,M,K;cin>>N>>M>>K;vector<int>S(K+1);for(int i=0;i<K+1;i++){cin>>S[i];S[i]--;}vector D(N,vector<ll>(N,INF));for(int i=0;i<N;i++)D[i][i]=0;for(int i=0;i<M;i++){int a,b;ll c;cin>>a>>b>>c;a--;b--;D[a][b]=c;D[b][a]=c;}for(int k=0;k<N;k++){for(int i=0;i<N;i++){for(int j=0;j<N;j++){chmin(D[i][j],D[i][k]+D[k][j]);}}}segment_tree<Monoid>seg(K);for(int i=0;i<K;i++)seg.set(i,D[S[i]][S[i+1]]);int Q;cin>>Q;while(Q--){int t,x,y;cin>>t>>x>>y;if(t==1){y--;S[x]=y;if(x>0)seg.set(x-1,D[S[x-1]][S[x]]);if(x+1<=K)seg.set(x,D[S[x]][S[x+1]]);}else{cout<<seg.prod(x,y)<<"\n";}}}