Submission #1359451

#TimeUsernameProblemLanguageResultExecution timeMemory
1359451jumpExamination (JOI19_examination)C++20
100 / 100
1156 ms205852 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<std::pair<int,int>, null_type,std::less<std::pair<int,int>>, rb_tree_tag,tree_order_statistics_node_update>
int n,q;
using T = std::tuple<int,int,int>;
std::vector<T> student;
std::vector<std::pair<T,int>> query;
std::vector<int> compress;
std::vector<int> cvalue[402000];
ordered_set value[802000];
void vins(int c,int l,int r,int idx,int v,int id){
  // std::cout << c << ' ' << l << ' ' << r << ' ' << idx << '\n';
  if(l==r&&r==idx){
    // std::cout << l << ',' << r << '\n';
    value[c].insert({v,id});
    return;
  }
  else if(l==r)return;
  if(idx<=r&&idx>=l){
    // std::cout << l << ',' << r << '\n';
    value[c].insert({v,id});
    int mid = (l+r)/2;
    vins(c*2,l,mid,idx,v,id);
    vins(c*2+1,mid+1,r,idx,v,id);
  }
}
int sum(int c,int l,int r,int ql,int qr,int min){
  if(l>qr||r<ql)return 0;
  if(ql<=l&&r<=qr){
    // std::cout << l << ',' << r << ' ' << value[c].size()-value[c].order_of_key(min) << "->";
    // for (auto x:value[c]) {
	  //   std::cout << x << ' ';
    // }
    // std::cout <<'\n';
    return value[c].size()-value[c].order_of_key({min,-1});
  }
  int mid=(l+r)/2;
  return sum(c*2,l,mid,ql,qr,min)+sum(c*2+1,mid+1,r,ql,qr,min);
}
int gid = 0;
void ins(T in){
  int b = std::get<1>(in);
  int idx = std::lower_bound(compress.begin(),compress.end(),b)-compress.begin();
  int c = std::get<2>(in);
  //std::cout << "ins " << idx << ' ' << c << '\n'; 
  cvalue[idx].push_back(c);
  vins(1,0,compress.size()-1,idx,c,gid++);
}
int getV(T in){
  int b = std::get<1>(in);
  int idx = std::lower_bound(compress.begin(),compress.end(),b)-compress.begin();
  int c = std::get<2>(in);
  int res = sum(1,0,compress.size()-1,idx,compress.size()-1,c);
  //std::cout << "get " << idx << ' ' << c << "->" << res << '\n'; 
  return res;
}
signed main() {
  //std::ios::sync_with_stdio(false);
  //std::cin.tie(nullptr);
  std::cin >> n >> q;
  for(int i=0;i<n;i++){
    int s,t;
    std::cin >> s >> t;
    student.push_back({s,t,s+t});
    compress.push_back(t);
  }
  for(int i=0;i<q;i++){
    int a,b,c;
    std::cin >> a >> b >> c;
    query.push_back({{a,b,c},i});
    compress.push_back(b);
  }
  std::sort(compress.begin(),compress.end());
  std::sort(student.rbegin(),student.rend());
  std::sort(query.rbegin(),query.rend());
  int sI=0,qI=0;
  // for(auto r:compress){
  //   std::cout << r << ' ';
  // }std::cout << '\n';
  std::vector<std::pair<int,int>> ans;
  while(qI<query.size()){
    while(sI<student.size()&&std::get<0>(student[sI])>=std::get<0>(query[qI].first)){
      ins(student[sI]);
      sI++;
    }
    int res = getV(query[qI].first);
    ans.push_back({query[qI].second,res});
    qI++;
  }
  std::sort(ans.begin(),ans.end());
  for(auto [idx,num]:ans){
    std::cout << num << '\n';
  }
}
/*
5 4
35 100
70 70
45 15
80 40
20 95
20 50 120
10 10 100
60 60 80
0 100 100
*/
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...