이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define ll long long
#define ff first
#define ss second
#define N 100005
#define MOD 1000000007
#define INF 0x3f3f3f3f
vector<pair<int, pair<int, int> > > ar;
vector<pair<pair<int, int>, pair<int, int> > > qu;
map<int, int> scmp, tcmp;
map<int, int> bit[N];
int get(int x, int y){
int s = 0;
while(x){
int t = y;
while(t){
auto it = bit[x].find(t);
if(it != bit[x].end())
s += it -> ss;
t -= t & -t;
}
x -= x & -x;
}
return s;
}
void update(int x, int y){
while(x < N){
int t = y;
while(t < N){
++bit[x][t];
t += t & -t;
}
x += x & -x;
}
}
int ans[N];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, q;
cin>>n>>q;
int mxs = 0, mxt = 0;
for(int i = 1; i <= n; ++i){
int s, t;
cin>>s>>t;
mxs = max(mxs, s);
mxt = max(mxt, t);
ar.push_back({s + t, {s, t}});
scmp[s] = 0;
tcmp[t] = 0;
}
int w;
w = 0;
for(auto& x : scmp)
x.ss = ++w;
w = 0;
for(auto& x : tcmp)
x.ss = ++w;
int ss = scmp.size(), ts = tcmp.size();
for(auto& x : ar){
x.ss.ff = ss + 1 - scmp[x.ss.ff];
x.ss.ss = ts + 1 - tcmp[x.ss.ss];
}
sort(ar.rbegin(), ar.rend());
for(int i = 1; i <= q; ++i){
int a, b, c;
cin>>a>>b>>c;
if(a > mxs || b > mxt)
continue;
a = scmp.lower_bound(a) -> ss;
b = tcmp.lower_bound(b) -> ss;
a = ss + 1 - a;
b = ts + 1 - b;
qu.push_back({{c, i}, {a, b}});
}
sort(qu.rbegin(), qu.rend());
w = 0;
for(auto& x : qu){
while(w != n && ar[w].ff >= x.ff.ff){
update(ar[w].ss.ff, ar[w].ss.ss);
++w;
}
ans[x.ff.ss] = get(x.ss.ff, x.ss.ss);
}
for(int i = 1; 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... |