結果
| 問題 |
No.878 Range High-Element Query
|
| コンテスト | |
| ユーザー |
Nachia
|
| 提出日時 | 2020-11-17 16:51:56 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 259 ms / 2,000 ms |
| コード長 | 1,753 bytes |
| コンパイル時間 | 2,156 ms |
| コンパイル使用メモリ | 185,132 KB |
| 実行使用メモリ | 12,480 KB |
| 最終ジャッジ日時 | 2024-07-23 08:21:47 |
| 合計ジャッジ時間 | 5,724 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
#define rep(i,n) for(int i=0; i<(n); i++)
struct AddQuery{
int t;
int p,x;
bool operator<(const AddQuery& r)const{ return t<r.t; }
};
struct SumQuery{
int t;
int p,mul;
int *dest;
bool operator<(const SumQuery& r)const{ return t<r.t; }
};
struct BIT{
int N;
vector<int> V;
vector<AddQuery> AQ;
vector<SumQuery> SQ;
BIT(vector<int> v){
N=v.size();
V.resize(N+1);
rep(i,N) V[i+1]=v[i];
rep(i,N+1){ if(i) if(i+(i&-i)<=N) V[i+(i&-i)]+=V[i]; }
}
void add(int p,int v){ p++; while(p<=N){ V[p]+=v; p+=p&-p; } }
int sum(int r){ int a=0; while(r){ a+=V[r]; r-=r&-r; } return a; }
void proc(){
sort(AQ.begin(),AQ.end());
sort(SQ.begin(),SQ.end());
int pAQ=0, pSQ=0;
while(true){
int tg=-1;
if(AQ.size()==pAQ){
if(SQ.size()==pSQ) break;
tg=1;
}
else if(SQ.size()==pSQ) tg=0;
else if(AQ[pAQ].t<SQ[pSQ].t) tg=0;
else tg=1;
if(tg==0){ add(AQ[pAQ].p,AQ[pAQ].x); pAQ++; }
if(tg==1){ (*SQ[pSQ].dest) += sum(SQ[pSQ].p) * SQ[pSQ].mul; pSQ++; }
}
}
};
int main() {
int N,Q; cin>>N>>Q;
vector<int> A(N); rep(i,N) cin>>A[i];
BIT G(vector<int>(N,0));
{
vector<int> L(N,-1);
stack<int> H;
rep(i,N){
while(H.size()){ if(A[H.top()]>A[i]) break; H.pop(); }
if(H.empty()) L[i]=-1; else L[i]=H.top();
H.push(i);
}
rep(i,N){
G.AQ.push_back({L[i]*2+1,i,1});
G.AQ.push_back({i*2+1,i,-1});
}
}
vector<int> ans(Q,0);
rep(i,Q){
int c; cin>>c;
int l,r; cin>>l>>r; l--;
G.SQ.push_back({l*2,r,1,&ans[i]});
}
G.proc();
rep(i,Q) cout<<ans[i]<<endl;
return 0;
}
Nachia