Submission #102225

#TimeUsernameProblemLanguageResultExecution timeMemory
102225ruhanhabib39Examination (JOI19_examination)C++17
100 / 100
1233 ms106720 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5;

struct Score {
   int s, t;
   int sum() const {
      return s + t;
   }
   bool operator<(Score o) const {
      if(sum() != o.sum()) return sum() > o.sum();
      if(s != o.s) return s < o.s;
      return t < o.t;
   }
};

struct Query {
   int i, a, b, c;
   bool operator<(Query q) const {
      if(c != q.c) return c > q.c;
      return i < q.i;
   }
};

int N, Q;
Score scores[MAXN + 10];
Query queries[MAXN + 10];
int res[MAXN + 10];

vector<int> svals, tvals;

void compress() {
   for(int i = 0; i < N; i++) {
      svals.push_back(scores[i].s);
      tvals.push_back(scores[i].t);
   }

   sort(svals.begin(), svals.end());
   svals.erase(unique(svals.begin(), svals.end()), svals.end());

   sort(tvals.begin(), tvals.end());
   tvals.erase(unique(tvals.begin(), tvals.end()), tvals.end());
}

struct SegT {
   int L, R, cc;
};

int tree[MAXN + 10];
SegT tree_t[int(1e7) + 10];

int create_seg_t(int l, int r, int cc) {
   static int ii = 0;
   tree_t[ii].L = l;
   tree_t[ii].R = r;
   tree_t[ii].cc = cc;
   ++ii;
   return ii - 1;
}

int get_t(int cn, int b, int e, int l, int r) {
   if(r < b || l > e || cn == -1) return 0;
   if(l <= b && e <= r) return tree_t[cn].cc;
   int m = (b + e) / 2;
   return get_t(tree_t[cn].L, b, m, l, r) + get_t(tree_t[cn].R, m+1, e, l, r);
}

int get_t(int cn, int ti) {
   return get_t(cn, 0, tvals.size() - 1, ti, tvals.size() - 1);
}

int get(int si, int ti) {
   si = svals.size() - si; // 0 -> n, n - 1 -> 1
   int rs = 0;
   while(si > 0) {
      rs += get_t(tree[si], ti);
      si -= si & (-si);
   }
   return rs;
}

int upd_t(int cn, int b, int e, int i) {
   //cerr << "upd_t(" << cn << ", [" << b << ", " << e << "], " << i << ")\n";
   //cerr << "-------->\n\n";
   if(cn == -1) {
      cn = create_seg_t(-1, -1, 0);
   }
   tree_t[cn].cc++;
   //cerr << "tree_t[" << cn << "].cc = " << tree_t[cn].cc << "\n";
   
   if(b == e) {
      //cerr << cn << " <---------------------\n\n";
      return cn;
   }

   int m = (b + e) / 2;
   //cerr << "cn = " << cn << "\n";
   if(i <= m) {
      tree_t[cn].L = upd_t(tree_t[cn].L, b, m, i);
      //cerr << "to left = " << tree_t[cn].L << "\n";
   } else {
      tree_t[cn].R = upd_t(tree_t[cn].R, m + 1, e, i);
      //cerr << "to right = " << tree_t[cn].R << "\n";
   }
   //cerr << cn << " --> " << tree_t[cn].L << " " << tree_t[cn].R << "\n";
   //cerr << cn << " <----------------\n\n";
   return cn;
}

int upd_t(int cn, int ti) {
   return upd_t(cn, 0, tvals.size() - 1, ti);
}

void upd(int si, int ti) {
   //cerr << si << " " << ti << "\n";
   si = svals.size() - si;
   while(si <= (int)svals.size()) {
      tree[si] = upd_t(tree[si], ti);
      si += si & (-si);
   }
}

void add(Score sc) {
   int si = lower_bound(svals.begin(), svals.end(), sc.s) - svals.begin();
   int ti = lower_bound(tvals.begin(), tvals.end(), sc.t) - tvals.begin();

   return upd(si, ti);
}

int calc(Query q) {
   int si = lower_bound(svals.begin(), svals.end(), q.a) - svals.begin();
   int ti = lower_bound(tvals.begin(), tvals.end(), q.b) - tvals.begin();
   return get(si, ti);
}

int main() {
   scanf("%d%d", &N, &Q);
   for(int i = 0; i < N; i++) {
      scanf("%d%d", &scores[i].s, &scores[i].t);
   }
   for(int i = 0; i < Q; i++) {
      scanf("%d%d%d", &queries[i].a, &queries[i].b, &queries[i].c);
      queries[i].i = i;
   }
   sort(scores, scores + N);
   sort(queries, queries + Q);


   compress();

   memset(tree, -1, sizeof tree);
   int i = 0;
   for(int q = 0; q < Q; q++) {
      while(i < N && scores[i].sum() >= queries[q].c) {
         add(scores[i]);
         i++;
      }
      res[queries[q].i] = calc(queries[q]);
   }

   for(int q = 0; q < Q; q++) {
      printf("%d\n", res[q]);
   }
}

Compilation message (stderr)

examination.cpp: In function 'int main()':
examination.cpp:138:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d%d", &N, &Q);
    ~~~~~^~~~~~~~~~~~~~~~
examination.cpp:140:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d%d", &scores[i].s, &scores[i].t);
       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
examination.cpp:143:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d%d%d", &queries[i].a, &queries[i].b, &queries[i].c);
       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...