Advertisement
Guest User

Untitled

a guest
May 26th, 2013
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.67 KB | None | 0 0
  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cstdlib>
  6. #include <tuple>
  7. using namespace std;
  8.  
  9. typedef long long ll;
  10.  
  11. struct TNode {
  12.     ll sumA, sumK;
  13.     TNode *left;
  14.     TNode *right;
  15.     void up() {
  16.         sumA = left->sumA + right->sumA;
  17.         sumK = left->sumK + right->sumK;
  18.     }
  19. };
  20.  
  21. TNode nodePool[10000000];
  22. int poolPtr = 0;
  23.  
  24. TNode* allocNode() {
  25.     return &nodePool[poolPtr++];
  26. }
  27.  
  28. TNode* copyNode(TNode* p) {
  29.     TNode* res = allocNode();
  30.     res->left = p->left;
  31.     res->right = p->right;
  32.     res->sumA = p->sumA;
  33.     res->sumK = p->sumK;
  34.     return res;
  35. }
  36.  
  37. TNode* addElement(TNode* current, int p, int level, ll valA, ll valK) {
  38.     current = copyNode(current);
  39.     if (level == 0) {
  40.         if (p != 0) abort();
  41.         current->sumA += valA;
  42.         current->sumK += valK;
  43.     } else {
  44.         if (p < (1<<(level - 1))) {
  45.             current->left = addElement(current->left, p, level-1, valA, valK);
  46.         } else {
  47.             current->right = addElement(current->right, p - (1<<(level - 1)), level-1, valA, valK);
  48.         }
  49.         current->up();
  50.     }
  51.     return current;
  52. }
  53.  
  54. ll getCount(TNode* c, int p, int level, int time) {
  55.     if (level == 0) {
  56.         return 0; //time*c->sumK + c->sumA;
  57.     }
  58.     if (p < (1<<(level - 1)))
  59.         return getCount(c->left, p, level - 1, time);
  60.     else
  61.         return time*c->left->sumK + c->left->sumA + getCount(c->right, p - (1<<(level - 1)), level - 1, time);
  62. }
  63.  
  64. vector<int> uniqVs;
  65. vector<int> uniqXs;
  66.  
  67. inline int getIndex(const vector<int>& uniqs, int v) {
  68.     return lower_bound(uniqs.begin(), uniqs.end(), v) - uniqs.begin();
  69. }
  70.  
  71. TNode* init(int level) {
  72.     TNode* n = allocNode();
  73.     n->sumA = 0;
  74.     n->sumK = 0;
  75.     if (level != 0) {
  76.         n->left = init(level - 1);
  77.         n->right = init(level - 1);
  78.     }
  79.     return n;
  80. }
  81.  
  82. int main(void) {
  83.     int n, m, q;
  84.     scanf("%d%d%d", &n, &m, &q);
  85.     typedef tuple<int, int, int, int> TAddReq;
  86.     vector<TAddReq> addReqs;
  87.     for (int i = 0; i < m; ++i) {
  88.         int a, b, v;
  89.         scanf("%d%d%d", &a, &b, &v);
  90.         uniqVs.push_back(v);
  91.         uniqXs.push_back(a);
  92.         uniqXs.push_back(b);
  93.         addReqs.push_back(TAddReq(a, v, -a + 1, 1));
  94.         addReqs.push_back(TAddReq(b + 1, v, b, -1));
  95.     }
  96.     ///////
  97.     sort(uniqVs.begin(), uniqVs.end());
  98.     uniqVs.erase(unique(uniqVs.begin(), uniqVs.end()), uniqVs.end());
  99.     ///////
  100.     sort(uniqXs.begin(), uniqXs.end());
  101.     uniqXs.erase(unique(uniqXs.begin(), uniqXs.end()), uniqXs.end());
  102.     ///////
  103.     sort(addReqs.begin(), addReqs.end());
  104.     vector<TNode*> trees;
  105.     const int level = 17;
  106.     trees.push_back(init(level));
  107.     for (int i = 0; i < (int)addReqs.size(); ++i) {
  108.         trees.push_back(addElement(trees.back(), getIndex(uniqVs, get<1>(addReqs[i])), level, get<2>(addReqs[i]), get<3>(addReqs[i])));
  109.     }
  110.     for (int i = 0; i < q; ++i) {
  111.         int x, y;
  112.         ll j;
  113.         scanf("%d%d%lld", &x, &y, &j);
  114.         int idx1 = lower_bound(addReqs.begin(), addReqs.end(), TAddReq(x, -1, -1, -1)) - addReqs.begin();
  115.         TNode *t1 = trees[idx1];
  116.         int idx2 = lower_bound(addReqs.begin(), addReqs.end(), TAddReq(y+1, -1, -1, -1)) - addReqs.begin();
  117.         TNode *t2 = trees[idx2];
  118.         int l = 0, r = (int)uniqVs.size();
  119.         while (r - l != 1) {
  120.             int med = (l + r) / 2;
  121.             ll cur = getCount(t2, med, level, y) - getCount(t1, med, level, x - 1);
  122.             if (cur >= j) {
  123.                 r = med;
  124.             } else {
  125.                 l = med;
  126.             }
  127.         }
  128.         printf("%d\n", uniqVs[l]);
  129.     }
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement