Submission #1272402

#TimeUsernameProblemLanguageResultExecution timeMemory
1272402hgiaExamination (JOI19_examination)C++20
43 / 100
602 ms245520 KiB
#include <bits/stdc++.h>
using namespace std;
#define aa array<int,4>
const int N=1e5+5;
const int ST=4e5+5;
const int maxnode=40000000;
int sz[maxnode],child[maxnode][2],n,t;
int timer=1;
int ans[N];
int root[ST];
aa a[N];
aa q[N];
vector<int>nen;
vector<int>nen1;
int newnode()
{
    timer++;
    child[timer][0]=child[timer][1]=0;
    sz[timer]=0;
    return timer;
}
void add(int& rt,int val)
{
    if(!rt)rt=newnode();
 int u=rt;
 sz[u]++;
 for(int i=20;i>=0;i--)
 {
   int c=(val>>i)&1;
   if(!child[u][c])child[u][c]=newnode();
   u=child[u][c];
   sz[u]++;
 }
}
int get(int rt,int val)
{
    if(!rt)return 0;
 int tmp=0;
 int u=rt;
 for(int i=20;i>=0;i--)
 {
   int c=(val>>i)&1;
   if(c==1)
   {
     tmp+=sz[child[u][0]];
     u=child[u][1];
   }
   else
     u=child[u][0];
 }
 return tmp;
}
 void update(int id,int l,int r,int pos,int val)
 {
   if(pos>r||pos<l)return ;
   add(root[id],val);
   if(l==r)return ;
   int mid=l+r>>1;
   update(id*2,l,mid,pos,val);
   update(id*2+1,mid+1,r,pos,val);
 }
 int get(int id,int l,int r,int L,int R,int val)
 {
   if(l>R||r<L)return 0;
   if(l>=L&&r<=R)
   {
       int rt=root[id];
       if(!rt)return 0;
       return sz[rt]-get(root[id],val);
   }
   int mid=l+r>>1;
   return get(id*2,l,mid,L,R,val)+get(id*2+1,mid+1,r,L,R,val);
 }
 bool cmp(aa a,aa b)
 {
     return a[0]>b[0];
 }
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>t;
    for(int i=1;i<=n;i++)
    {
         cin>>a[i][0]>>a[i][1];
         a[i][2]=a[i][0]+a[i][1];
         nen.push_back(a[i][2]);
         nen1.push_back(a[i][1]);
    }
    for(int i=1;i<=t;i++)
    {
         cin>>q[i][0]>>q[i][1]>>q[i][2];
         nen1.push_back(q[i][1]);
         nen.push_back(q[i][2]);
         q[i][3]=i;
    }
    sort(nen.begin(),nen.end());
    nen.erase(unique(nen.begin(),nen.end()),nen.end());
    sort(nen1.begin(),nen1.end());
    nen1.erase(unique(nen1.begin(),nen1.end()),nen1.end());
    int m=nen.size();
    for(int i=1;i<=n;i++)
    {
        a[i][1]=lower_bound(nen1.begin(),nen1.end(),a[i][1])-nen1.begin()+1;
        a[i][2]=lower_bound(nen.begin(),nen.end(),a[i][2])-nen.begin()+1;
    }
    for(int i=1;i<=t;i++)
    {
        q[i][1]=lower_bound(nen1.begin(),nen1.end(),q[i][1])-nen1.begin()+1;
        q[i][2]=lower_bound(nen.begin(),nen.end(),q[i][2])-nen.begin()+1;
    }

    sort(a+1,a+n+1,cmp);
    sort(q+1,q+t+1,cmp);
    int j=1;
    for(int i=1;i<=t;i++)
    {
         int x=q[i][0],y=q[i][1],z=q[i][2],id=q[i][3];
         while(j<=n&&x<=a[j][0])
         {
             update(1,1,m,a[j][2],a[j][1]);
             j++;
         }
         ans[id]=get(1,1,m,q[i][2],m,y);
    }
    for(int i=1;i<=t;i++)cout<<ans[i]<<endl;
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...