제출 #201363

#제출 시각아이디문제언어결과실행 시간메모리
201363NordwayExamination (JOI19_examination)C++14
100 / 100
1787 ms386660 KiB
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#define x first
#define y second
#define pb push_back
#define mp make_pair
#define all(v) v.begin(),v.end()
#define sz(v) (int)v.size()
#define up_b upper_bound
#define low_b lower_bound
#define nl '\n'

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;

typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;

const int N=1e5+11;
const int M=3e5+11;
const int W=1e3+11;
const int inf=1e9;
const ll INF=1e18;
const ll mod=1e9+7;
const ld EPS=1e-9;

struct st{
  int res=0;
  st *l=0,*r=0;
  int tl,tr;
  st(int a,int b){
    tl=a,tr=b;
  }
  void upd(int pos,int val){
    if(tl==tr){
      res+=val;
      return ;
    }
    int tm=(tl+tr)/2;
    if(pos<=tm){
      if(!l)l=new st(tl,tm);
      l->upd(pos,val);
    }
    else{
      if(!r)r=new st(tm+1,tr);
      r->upd(pos,val);
    }
    res=(l?l->res:0)+(r?r->res:0);
  }
  int get(int a,int b){
    if(tl>b||a>tr)return 0;
    if(a<=tl&&tr<=b)return res;
    return (l?l->get(a,b):0)+(r?r->get(a,b):0);
  }
};

struct bit{
  st *t[N];
  bit(){
    memset(t,0,sizeof(t));
  }
  void upd(int x,int y,int val){
    for(int i=x;i<N;i=(i|(i+1))){
      if(!t[i])t[i]=new st(1,N);
      t[i]->upd(y,val);
    }
  }
  int get(int x,int y){
    int res=0;
    for(int i=x;i>=0;i=(i&(i+1))-1){
      if(!t[i])continue;
      res+=t[i]->get(y,N-1);
    }
    return res;
  }
};

bit t;

pair<pair<int,int>,int>a[N],q[N];
int b[N],c[N];
int res[N];

int main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0),cout.tie(0);
  int n,Q;
  cin>>n>>Q;
  vector<int>x,y,z;
  for(int i=1;i<=n;i++){
    cin>>a[i].x.x>>a[i].x.y;
    a[i].y=i;
    x.pb(a[i].x.x);
    y.pb(a[i].x.y);
    z.pb(a[i].x.x+a[i].x.y);
  }
  sort(all(x));
  sort(all(y));
  sort(all(z));
  for(int i=1;i<=n;i++){
    b[i]=low_b(all(z),a[i].x.x+a[i].x.y)-z.begin()+1;
    a[i].x.x=low_b(all(x),a[i].x.x)-x.begin()+1;
    a[i].x.y=low_b(all(y),a[i].x.y)-y.begin()+1;
  }
  sort(a+1,a+n+1);
  for(int i=1;i<=Q;i++){
    cin>>q[i].x.x>>q[i].x.y>>c[i];
    q[i].x.x=low_b(all(x),q[i].x.x)-x.begin()+1;
    q[i].x.y=low_b(all(y),q[i].x.y)-y.begin()+1;
    c[i]=low_b(all(z),c[i])-z.begin()+1;
    q[i].y=i;
  }
  sort(q+1,q+Q+1);
  reverse(q+1,q+Q+1);
  int j=n;
  for(int i=1;i<=Q;i++){
    while(j&&a[j].x.x>=q[i].x.x)t.upd(a[j].x.y,b[a[j].y],1),j--;
    res[q[i].y]=t.get(N-1,c[q[i].y])-t.get(q[i].x.y-1,c[q[i].y]);
  }
  for(int i=1;i<=Q;i++){
    cout<<res[i]<<"\n";
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...