이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vl;
typedef pair<ll,ll> pl;
class ST {
private:
vl st;
int n;
public:
ST(int n_) {
n = n_;
st.assign(2*n,0);
}
void up(ll l, ll r, ll val) {
l += n;
r += n;
for(;l<r;l>>=1,r>>=1) {
if(l&1) {
st[l] = max(st[l],val);
l++;
}
if(r&1) {
--r;
st[r] = max(st[r],val);
}
}
}
ll get(int p) {
p += n;
ll res = 0;
while(p > 0) {
res = max(res,st[p]);
p >>= 1;
}
return res;
}
};
vl w;
struct Q {
ll idx,lf,rt,lim;
bool operator<(const Q& other) {
return lf < other.lf;
}
};
vector<vector<pl>> up;
int main() {
ios::sync_with_stdio(0);cin.tie(0);
ll n,q;
cin >> n >> q;
for(int i=0;i<n;i++) {
ll t;
cin >> t;
w.push_back(t);
}
up.assign(n,vector<pl>());
stack<pl> su;
for(int i=n-1;i>=0;i--) {
while(!su.empty() && su.top().second < w[i]) {
up[i].push_back(su.top());
su.pop();
}
su.emplace(i,w[i]);
}
vector<Q> qv;
for(int i=0;i<q;i++) {
ll lf,rt,lim;
cin >> lf >> rt >> lim;
lf--;rt--;
qv.push_back({i,lf,rt,lim});
}
sort(qv.begin(),qv.end());
vl ans(q,0);
int xv = n-1;
ST st(n);
for(int i=q-1;i>=0;i--) {
while(xv >= qv[i].lf) {
for(const auto& it: up[xv]) {
st.up(it.first,n,it.second+w[xv]);
}
xv--;
}
ans[qv[i].idx] = qv[i].lim >= st.get(qv[i].rt);
}
for(int i=0;i<q;i++) {
cout << ans[i] << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |