結果
| 問題 |
No.2065 Sum of Min
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-09-02 21:59:51 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 662 ms / 2,000 ms |
| コード長 | 1,545 bytes |
| コンパイル時間 | 1,906 ms |
| コンパイル使用メモリ | 163,272 KB |
| 実行使用メモリ | 56,344 KB |
| 最終ジャッジ日時 | 2024-11-16 03:24:45 |
| 合計ジャッジ時間 | 13,933 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
#define _USE_MATH_DEFINES
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<string>
#include<iomanip>
#include<numeric>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<map>
#include<random>
#include<bitset>
#include<cassert>
#include<complex>
#include<fstream>
#include<cstdlib>
#include<functional>
#include<array>
using namespace std;
typedef long long ll;
const int mod=998244353;
class RMQ{
int n;
vector<int>vec;
vector<vector<int>>dat;
vector<vector<ll>>sum;
public:
void init(int k,int l,int r){
if(r-l==1)
dat[k].push_back(vec[k-(n-1)]);
else{
init(k*2+1,l,(l+r)/2);
init(k*2+2,(l+r)/2,r);
merge(dat[k*2+1].begin(),dat[k*2+1].end(),dat[k*2+2].begin(),dat[k*2+2].end(),back_inserter(dat[k]));
}
sum[k].resize(dat[k].size()+1);
for(int i=0;i<dat[k].size();i++)
sum[k][i+1]=sum[k][i]+dat[k][i];
}
RMQ(vector<int>a):n(1),vec(a){
while(n<a.size())
n*=2;
vec.resize(n);
dat.resize(2*n-1);
sum.resize(2*n-1);
init(0,0,n);
}
ll query(int a,int b,int x,int k=0,int l=0,int r=-1){
if(r==-1)
r=n;
if(r<=a||b<=l)
return 0;
if(a<=l&&r<=b){
int itr=lower_bound(dat[k].begin(),dat[k].end(),x)-dat[k].begin();
return sum[k][itr]+ll(dat[k].size()-itr)*x;
}
ll vl=query(a,b,x,k*2+1,l,(l+r)/2);
ll vr=query(a,b,x,k*2+2,(l+r)/2,r);
return vl+vr;
}
};
int main(){
static int n,q,a[100000],l,r,x;
cin>>n>>q;
for(int i=0;i<n;i++)
cin>>a[i];
RMQ seg(vector<int>(a,a+n));
while(cin>>l>>r>>x)
cout<<seg.query(--l,r,x)<<endl;
}