Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.45 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. using pi = pair<int, int>;
  5. #define st first
  6. #define nd second
  7. const int INF = 1.5e9;
  8. struct Tree1D
  9. {
  10.     int n;
  11.     vector<int> c;
  12.     vector<int> sum;
  13.     Tree1D(): n(0), c({-INF, INF}), sum(0) {}
  14.     void add_point(int x)
  15.     {
  16.         c.push_back(x);
  17.     }
  18.     void init()
  19.     {
  20.         sort(c.begin(), c.end());
  21.         c.erase(unique(c.begin(), c.end()), c.end());
  22.         n = 1;
  23.         while(n<(int)c.size()) n*=2;
  24.         sum.resize(2*n, 0);
  25.     }
  26.     int convert(int x)
  27.     {
  28.         return lower_bound(c.begin(), c.end(), x)-c.begin();
  29.     }
  30.     void add(int v, int x)
  31.     {
  32.         v = convert(v)+n;
  33.         while(v)
  34.         {
  35.             sum[v] += x;
  36.             v /= 2;
  37.         }
  38.     }
  39.     int query(int va, int vb)
  40.     {
  41.         //cerr << va << " " << vb << "\n";
  42.         va = convert(va)+n; vb = convert(vb+1)-1+n;
  43.         //cerr << "Tree1D: " << va << " " << vb << ", " <<  c[va-n] <<" " << c[vb-n] << "\n";
  44.         if(vb<va) return 0;
  45.         int res = sum[va];
  46.         if(va!=vb) res += sum[vb];
  47.         while(va/2!=vb/2)
  48.         {
  49.             if(va%2==0) res += sum[va+1];
  50.             if(vb%2==1) res += sum[vb-1];
  51.             va /= 2;
  52.             vb /= 2;
  53.         }
  54.         //cerr << "res=" << res << "\n";
  55.         return res;
  56.     }
  57. };
  58.  
  59. struct Tree2D
  60. {
  61.     int n;
  62.     vector<int> c;
  63.     vector<Tree1D> sum;
  64.     Tree2D(): n(0), c({-INF, INF}), sum(0) {}
  65.     void add_point(int x)
  66.     {
  67.         c.push_back(x);
  68.     }
  69.     void init()
  70.     {
  71.         sort(c.begin(), c.end());
  72.         c.erase(unique(c.begin(), c.end()), c.end());
  73.         n = 1;
  74.         while(n<(int)c.size()) n*=2;
  75.         sum.resize(2*n);
  76.     }
  77.     int convert(int x)
  78.     {
  79.         return lower_bound(c.begin(), c.end(), x)-c.begin();
  80.     }
  81.     void add_point2d(pi p)
  82.     {
  83.         int v = convert(p.st)+n;
  84.         while(v)
  85.         {
  86.             sum[v].add_point(p.nd);
  87.             v /= 2;
  88.         }
  89.     }
  90.     void init2()
  91.     {
  92.         for(int i=1; i<2*n; ++i) sum[i].init();
  93.     }
  94.     void add(pi p, int x)
  95.     {
  96.         int v = convert(p.st)+n;
  97.         while(v)
  98.         {
  99.             sum[v].add(p.nd, x);
  100.             v /= 2;
  101.         }
  102.     }
  103.     int query(pi p1, pi p2)
  104.     {
  105.         int va = convert(p1.st)+n;
  106.         int vb = convert(p2.st+1)-1+n;
  107.         //cerr << "Tree2d: " << va << " " << vb << ", " << c[va-n] << " " << c[vb-n] << "\n";
  108.         if(vb<va) return 0;
  109.         int res = sum[va].query(p1.nd, p2.nd);
  110.         if(vb!=va) res += sum[vb].query(p1.nd, p2.nd);
  111.         while(va/2!=vb/2)
  112.         {
  113.             if(va%2==0) res += sum[va+1].query(p1.nd, p2.nd);
  114.             if(vb%2==1) res += sum[vb-1].query(p1.nd, p2.nd);
  115.             va /=2; vb /= 2;
  116.         }
  117.         return res;
  118.     }
  119.     void startup(const vector<pi>& p)
  120.     {
  121.         for(pi i: p) add_point(i.st);
  122.         init();
  123.         for(pi i: p) add_point2d(i);
  124.         init2();
  125.     }
  126. };
  127.  
  128. struct Tree1Drev
  129. {
  130.     int n;
  131.     vector<int> c;
  132.     vector<int> sum;
  133.     Tree1Drev(): n(0), c({-INF, INF}), sum(0) {}
  134.     void add_point(int x)
  135.     {
  136.         c.push_back(x);
  137.     }
  138.     void init()
  139.     {
  140.         sort(c.begin(), c.end());
  141.         c.erase(unique(c.begin(), c.end()), c.end());
  142.         n = 1;
  143.         while(n<(int)c.size()) n*=2;
  144.         sum.resize(2*n, 0);
  145.     }
  146.     int convert(int x)
  147.     {
  148.         return lower_bound(c.begin(), c.end(), x)-c.begin();
  149.     }
  150.     int query(int v)
  151.     {
  152.         v = convert(v)+n;
  153.         int res = 0;
  154.         while(v)
  155.         {
  156.             res += sum[v];
  157.             v /= 2;
  158.         }
  159.         return res;
  160.     }
  161.     void add(int va, int vb, int x)
  162.     {
  163.         //cerr << va << " " << vb << "\n";
  164.         va = convert(va)+n; vb = convert(vb+1)-1+n;
  165.         //cerr << "Tree1D: " << va << " " << vb << ", " <<  c[va-n] <<" " << c[vb-n] << "\n";
  166.         if(vb<va) return;
  167.         sum[va]+=x;
  168.         if(va!=vb) sum[vb] += x;
  169.         while(va/2!=vb/2)
  170.         {
  171.             if(va%2==0) sum[va+1]+=x;
  172.             if(vb%2==1) sum[vb-1]+=x;
  173.             va /= 2;
  174.             vb /= 2;
  175.         }
  176.         //cerr << "res=" << res << "\n";
  177.     }
  178. };
  179.  
  180. struct Tree2Drev
  181. {
  182.     int n;
  183.     vector<int> c;
  184.     vector<Tree1Drev> sum;
  185.     Tree2Drev(): n(0), c({-INF, INF}), sum(0) {}
  186.     void add_point(int x)
  187.     {
  188.         c.push_back(x);
  189.     }
  190.     void init()
  191.     {
  192.         sort(c.begin(), c.end());
  193.         c.erase(unique(c.begin(), c.end()), c.end());
  194.         n = 1;
  195.         while(n<(int)c.size()) n*=2;
  196.         sum.resize(2*n);
  197.     }
  198.     int convert(int x)
  199.     {
  200.         return lower_bound(c.begin(), c.end(), x)-c.begin();
  201.     }
  202.     void add_point2d(pi p)
  203.     {
  204.         int v = convert(p.st)+n;
  205.         while(v)
  206.         {
  207.             sum[v].add_point(p.nd);
  208.             v /= 2;
  209.         }
  210.     }
  211.     void init2()
  212.     {
  213.         for(int i=1; i<2*n; ++i) sum[i].init();
  214.     }
  215.     int query(pi p)
  216.     {
  217.         int v = convert(p.st)+n;
  218.         int res = 0;
  219.         while(v)
  220.         {
  221.             res += sum[v].query(p.nd);
  222.             v /= 2;
  223.         }
  224.         return res;
  225.     }
  226.     void add(pi p1, pi p2, int x)
  227.     {
  228.         int va = convert(p1.st)+n;
  229.         int vb = convert(p2.st+1)-1+n;
  230.         //cerr << "Tree2d: " << va << " " << vb << ", " << c[va-n] << " " << c[vb-n] << "\n";
  231.         if(vb<va) return;
  232.         sum[va].add(p1.nd, p2.nd, x);
  233.         if(vb!=va) sum[vb].add(p1.nd, p2.nd, x);
  234.         while(va/2!=vb/2)
  235.         {
  236.             if(va%2==0) sum[va+1].add(p1.nd, p2.nd, x);
  237.             if(vb%2==1) sum[vb-1].add(p1.nd, p2.nd, x);
  238.             va /=2; vb /= 2;
  239.         }
  240.     }
  241.     void startup(const vector<pi>& p)
  242.     {
  243.         for(pi i: p) add_point(i.st);
  244.         init();
  245.         for(pi i: p) add_point2d(i);
  246.         init2();
  247.     }
  248. };
  249.  
  250. const int N = 1e5+5;
  251. int type[N];
  252. pi q1[N], q2[N];
  253. int main()
  254. {
  255.     int q;
  256.     scanf("%d", &q);
  257.     //q = 1e5;
  258.     vector<pi> points;
  259.     for(int i=0; i<q; ++i)
  260.     {
  261.         scanf("%d%d%d", &type[i], &q1[i].st, &q1[i].nd);
  262.         if(type[i]==2) scanf("%d%d", &q2[i].st, &q2[i].nd);
  263.         //type[i] = i%2+1;
  264.         //q1[i].st = rand()%1000+1; q1[i].nd = rand()%1000+1;
  265.         //q2[i] = pi(10000, 10000);
  266.         if(type[i]==1) points.push_back(q1[i]);
  267.     }
  268.     Tree2D pt;
  269.     Tree2Drev rt;
  270.     pt.startup(points);
  271.     rt.startup(points);
  272.     ll res = 0;
  273.     for(int i=0; i<q; ++i)
  274.     {
  275.         if(type[i]==1)
  276.         {
  277.             pt.add(q1[i], 1);
  278.             res += rt.query(q1[i]);
  279.         }
  280.         else
  281.         {
  282.             rt.add(q1[i], q2[i], 1);
  283.             res += pt.query(q1[i], q2[i]);
  284.         }
  285.         printf("%lld\n", res);
  286.     }
  287.    
  288. }
  289. /*
  290. 5
  291. 1 2 3
  292. 1 2 2
  293. 1 3 4
  294. 2 1 1 5 5
  295. 2 2 2 2 2
  296.  
  297. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement