結果

問題 No.2640 traO Stamps
ユーザー GOTKAKO
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0