結果
| 問題 | No.3614 Breaking door keys(LITTLE BREAK ver.) |
| コンテスト | |
| ユーザー |
kazuppa
|
| 提出日時 | 2026-08-05 22:41:08 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 291 ms / 2,000 ms |
| + 629µs | |
| コード長 | 1,123 bytes |
| 記録 | |
| コンパイル時間 | 2,073 ms |
| コンパイル使用メモリ | 337,872 KB |
| 実行使用メモリ | 39,424 KB |
| 最終ジャッジ日時 | 2026-08-06 13:39:52 |
| 合計ジャッジ時間 | 9,382 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_1 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| サンプル | 0 % | AC * 3 |
| 小課題1 | 10 % | AC * 7 |
| 小課題2 | 20 % | AC * 7 |
| 小課題3 | 30 % | AC * 7 |
| 小課題4 | 30 % | AC * 14 |
| 小課題5 | 10 % | AC * 38 |
| 合計 | 2.5 * 100% = 250 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
template<typename S,auto op,auto e>
struct segtree{
private:
int siz;
vector<S> val;
S prod(int l,int r,int a,int b,int u){
if(l<=a&&b<=r)return val[u];
if(b<=l||r<=a)return e();
int m=(a+b)/2;
return op(prod(l,r,a,m,2*u),prod(l,r,m,b,2*u+1));
}
public:
segtree(vector<S> a){
int n=a.size();siz=1;
while(siz<n)siz*=2;
val.resize(siz*2,e());
for(int i=0;i<n;i++)val[i+siz]=a[i];
for(int i=siz-1;i>=1;i--)val[i]=op(val[2*i],val[2*i+1]);
}
S prod(int l,int r){return prod(l,r,0,siz,1);}
};
using ar=array<ll,10>;
ar f={1<<30,1<<30,1<<30,1<<30,1<<30,1<<30,1<<30,1<<30,1<<30,1<<30};
ar op(ar a,ar b){
ar c;int l=0,r=0;
for(int i=0;i<10;i++){
if(a[l]<b[r])c[i]=a[l],l++;
else c[i]=b[r],r++;
}
return c;
}
ar e(){return f;}
int main(){
int n,q;cin>>n>>q;
vector<ar> s(n,f);
for(int i=0;i<n;i++)cin>>s[i][0];
segtree<ar,op,e> seg(s);
while(q--){
int l,r,k;cin>>l>>r>>k;
l--;
ar p=seg.prod(l,r);
ll ans=0;
for(int i=0;i<k;i++)ans+=p[i];
cout<<ans<<endl;
}
}
kazuppa