Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #include <vector>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <set>
  9. #include <map>
  10. #include <queue>
  11. #include <ctime>
  12.  
  13. #define pb push_back
  14. #define ll long long
  15. #define mp make_pair
  16. #define f first
  17. #define s second
  18. #define pii pair < int, int >
  19. #define ull unsigned long long
  20. #define pll pair < ll, ll >
  21. #define forit(it, s) for(__typeof(s.begin()) it = s.begin(); it != s.end(); it ++)
  22. #define all(s) s.begin(), s.end()
  23. #define sz(a) (int)a.size()
  24.  
  25. const int inf = (1ll << 30) - 1;
  26. const int maxn = (int) 1e5 + 10;
  27.  
  28. using namespace std;
  29.  
  30. int A[544][544];
  31. int B[544][544];
  32. int L_pos[200200];
  33. int R_pos[200200];
  34. int pos[200200];
  35. int K = 455;
  36. vector<int> G[544];
  37. vector<int> L[544];
  38. vector<int> R[544];
  39. int l[200200];
  40. int r[200200];
  41.  
  42. void insA(int x, int id){
  43.     G[x].pb(id);
  44.     for(int i = (int)G[x].size()-1; i > 0; i--){
  45.         int a = G[x][i];
  46.         int b = G[x][i-1];
  47.         if(r[a] - l[a] > r[b] - l[b]) swap(G[x][i], G[x][i-1]);
  48.     }
  49. }
  50. void insB(int x, int id){
  51.     L[x].pb(id);
  52.    
  53.     for(int i = (int)L[x].size()-1; i > 0; i--){
  54.         int a = L[x][i];
  55.         int b = L[x][i-1];
  56.         if(l[a] > l[b])swap(L[x][i], L[x][i-1]);
  57.     }
  58. }
  59. void insC(int x, int id){
  60.     R[x].pb(id);
  61.    
  62.     for(int i = (int)R[x].size()-1; i > 0; i--){
  63.         int a = R[x][i];
  64.         int b = R[x][i-1];
  65.         if(r[a] < r[b]) swap(R[x][i], R[x][i-1]);
  66.     }
  67. }
  68.  
  69. void add(int id){
  70.     L_pos[id] = K-1;
  71.     for(int i = 1; i < K; i++){
  72.         if(L[i+1].size() > 0 && l[L[i+1][0]] >= l[id]) continue;
  73.         L_pos[id] = i;
  74.         break;
  75.     }
  76.     R_pos[id] = K-1;
  77.     for(int i = 1; i < K; i++){
  78.         if(R[i+1].size() > 0 && r[R[i+1][0]] <= r[id]) continue;
  79.         R_pos[id] = i;
  80.         break;
  81.     }
  82.     pos[id] = K-1;
  83.     for(int i = 1; i < K; i++){
  84.         if(G[i+1].size() > 0 && r[G[i+1][0]] - l[G[i+1][0]] >= r[id] - l[id]) continue;
  85.         pos[id] = i;
  86.         break;
  87.     }
  88.     insA(pos[id], id);
  89.     insB(L_pos[id], id);
  90.     insC(R_pos[id], id);
  91.     for(int i = L_pos[id]; i < K; i++)
  92.         A[pos[id]][i]++;
  93.  
  94.     for(int i = R_pos[id]; i < K; i++)
  95.         B[pos[id]][i]++;
  96. }
  97. int T;
  98.  
  99. void del(int id){
  100.     for(int i = L_pos[id]; i < K; i++){
  101.         A[pos[id]][i]--;
  102.     }
  103.     for(int i = R_pos[id]; i < K; i++){
  104.         B[pos[id]][i]--;
  105.     }
  106.     forit(it, L[L_pos[id]]) {
  107.         if(*it == id){
  108.             L[L_pos[id]].erase(it);
  109.             break;
  110.         }
  111.     }
  112.     forit(it, R[R_pos[id]]) {
  113.         if(*it == id){
  114.             R[R_pos[id]].erase(it);
  115.             break;
  116.         }
  117.     }
  118.     forit(it, G[pos[id]]) {
  119.         if(*it == id){
  120.             G[pos[id]].erase(it);
  121.             break;
  122.         }
  123.     }
  124. }
  125.  
  126. int was[200200];
  127. int get(int a, int b, int k){
  128.     if(b - a + 1 < k) return 0;
  129.     int c = 1;
  130.     int ans = 0;
  131.     while(c+1 < K && G[c+1].size()>0 && r[G[c+1][0]] - l[G[c+1][0]] + 1 >= k) {
  132.         ans += G[c].size();
  133.         c++;
  134.     }
  135.     int d = 1;
  136.     while(d + 1< K && R[d+1].size() > 0 && r[R[d+1][0]] < a + k - 1){
  137.         d++;
  138.     }
  139.     int e = 1;
  140.     while(e + 1 < K && L[e+1].size() > 0 && l[L[e+1][0]] > b - k + 1){
  141.         e++;
  142.     }
  143.     for(int i = 1; i < c; i++){
  144.         ans -= A[i][e-1];
  145.     }
  146.     for(int i = 1; i < c; i++){
  147.         ans -= B[i][d-1];
  148.     }
  149.     ++T;
  150.     for(int i = 0; i < G[c].size(); i++){
  151.         int id = G[c][i];
  152.         if(min(r[id], b) - max(a, l[id]) + 1 >= k) ans++;
  153.     }
  154.     for(int i = 0; i < L[e].size(); i++){
  155.         int id = L[e][i];
  156.         if(pos[id] >= c) continue;
  157.         if(R_pos[id] < d) continue;
  158.         if(min(r[id], b) - max(a, l[id]) + 1 < k) --ans;
  159.         was[id] = T;
  160.     }
  161.     for(int i = 0; i < R[d].size(); i++){
  162.         int id = R[d][i];
  163.         if(pos[id] >= c || was[id] == T) continue;
  164.         if(L_pos[id] < e) continue;
  165.         if(min(r[id], b) - max(a, l[id]) + 1 < k) --ans;
  166.     }
  167.     return ans;
  168. }
  169.  
  170. void recalc(){
  171.     vector<int> a, b, c;
  172.     for(int i = 1; i < K; i++){
  173.         forit(it, G[i]) a.pb(*it);
  174.         G[i].clear();
  175.     }
  176.     for(int i = 1; i < K; i++){
  177.         forit(it, R[i]) b.pb(*it);
  178.         R[i].clear();
  179.     }
  180.     for(int i = 1; i < K; i++){
  181.         forit(it, L[i]) c.pb(*it);
  182.         L[i].clear();
  183.     }
  184.     for(int i = 1; i < K; i++){
  185.         for(int j = 1; j < K; j++){
  186.             A[i][j] = 0;
  187.             B[i][j] = 0;
  188.         }
  189.     }
  190.     for(int i = 0 ; i < b.size(); i++){
  191.         int ind = i/K + 1;
  192.         R_pos[b[i]] = ind;
  193.         R[ind].pb(b[i]);
  194.     }
  195.     for(int i = 0 ; i < c.size(); i++){
  196.         int ind = i/K + 1;
  197.         L_pos[c[i]] = ind;
  198.         L[ind].pb(c[i]);
  199.     }
  200.     for(int i = 0; i < a.size(); i++){
  201.         int ind = i/K + 1;
  202.         pos[a[i]] = ind;
  203.         G[ind].pb(a[i]);
  204.         A[ind][L_pos[a[i]]]++;
  205.         B[ind][R_pos[a[i]]]++;
  206.     }
  207.  
  208.     for(int i = 1; i < K; i++){
  209.         for(int j = 1; j < K; j++){
  210.             A[i][j] += A[i][j-1];
  211.             B[i][j] += B[i][j-1];
  212.         }
  213.     }
  214. }
  215. void solve(){
  216.     int q;
  217.     scanf("%d", &q);
  218.     int id = 1;
  219.     vector<int> ans;
  220.     for(int i = 0, ty, a, b, k; i < q; i++){
  221.         scanf("%d", &ty);
  222.         if(i % K == K-2) recalc();
  223.         if(ty == 1){
  224.             scanf("%d%d", &l[id], &r[id]);
  225.             add(id);
  226.             ++id;
  227.         }
  228.         else if(ty==2){
  229.             scanf("%d", &a);
  230.             del(a);
  231.         }
  232.         else if(ty == 3){
  233.             scanf("%d%d%d", &a, &b, &k);
  234.             int g = get(a, b, k);
  235.             ans.pb(g);
  236.         }
  237.     }
  238.     forit(it, ans){
  239.         printf("%d\n", *it);
  240.     }
  241. }
  242.  
  243. int main () {
  244.     #ifdef LOCAL
  245.     freopen("a.in", "r", stdin);
  246.     freopen("a.out", "w", stdout);
  247.     #endif
  248.     int t=1;
  249.     //scanf("%d", &t);
  250.     for(int i=1; i <= t; i++){
  251.       //printf("Case #%d\n", i);
  252.       solve();
  253.     }
  254.  
  255.     return 0;
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement