Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.59 KB | None | 0 0
  1. #pragma GCC optimize("Ofast")
  2. #pragma GCC target("avx,avx2,fma")
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. int cnt;
  7.  
  8. const int MAX = 2169800;
  9. const int INF = 1000000000;
  10.  
  11. struct segment{
  12.     int val;
  13.     int lazy;
  14.     int koji;
  15. } seg[4*MAX+5];
  16.  
  17. int sta[MAX+5];
  18.  
  19. void propagate(int node, int l, int r){
  20.     seg[node].val += seg[node].lazy;
  21.     if(l == r){
  22.         seg[node].lazy = 0;
  23.         return;
  24.     }
  25.     seg[node*2].lazy += seg[node].lazy;
  26.     seg[node*2+1].lazy += seg[node].lazy;
  27.     seg[node].lazy = 0;
  28. }
  29.  
  30. void updatuj(int node, int l, int r){
  31.     seg[node].val = min(seg[node*2].val+seg[node*2].lazy, seg[node*2+1].val+seg[node*2+1].lazy);
  32.     if(seg[node*2].val+seg[node*2].lazy == seg[node].val) seg[node].koji = seg[node*2].koji;
  33.     else seg[node].koji = seg[node*2+1].koji;
  34. }
  35.  
  36. void updseg(int node, int l, int r, int tl, int tr, int val){
  37.     if(l > tr || tl > r) return;
  38.     if(tl <= l && r <= tr){
  39.         seg[node].lazy += val;
  40.         propagate(node, l, r);
  41.         return;
  42.     }
  43.     propagate(node, l, r);
  44.     int mid = (l+r)/2;
  45.     updseg(node*2, l, mid, tl, tr, val);
  46.     updseg(node*2+1, mid+1, r, tl, tr, val);
  47.     updatuj(node, l, r);
  48. }
  49.  
  50. void updpoint(int node, int l, int r, int x, int val){
  51.     if(l == r){
  52.         seg[node].koji = l;
  53.         seg[node].val = val;
  54.         seg[node].lazy = 0;
  55.         return;
  56.     }
  57.     propagate(node, l, r);
  58.     int mid = (l+r)/2;
  59.     if(mid >= x) updpoint(node*2, l, mid, x, val);
  60.     else updpoint(node*2+1, mid+1, r, x, val);
  61.     updatuj(node, l, r);
  62. }
  63.  
  64. void init(int node, int l, int r){
  65.     if(l == r){
  66.         seg[node].koji = seg[node].val = INF;
  67.         return;
  68.     }
  69.     seg[node].koji = seg[node].val = INF;
  70.     int mid = (l+r)/2;
  71.     init(node*2, l, mid);
  72.     init(node*2+1, mid+1, r);
  73. }
  74.  
  75. int getval(int node, int l, int r, int x){
  76.     propagate(node, l, r);
  77.     if(l == r) return seg[node].val;
  78.     int mid = (l+r)/2;
  79.     if(mid >= x) return getval(node*2, l, mid, x);
  80.     return getval(node*2+1, mid+1, r, x);
  81. }
  82.  
  83. /// MOJE
  84. void solve(){
  85.     int n;
  86.     cin >> n;
  87.     /*if(n < sta[cnt]){
  88.         int l = 1;
  89.         int r = cnt;
  90.         while(l < r){
  91.             int mid = (l + r) / 2;
  92.             if(sta[mid] > n)r = mid;
  93.             else l = mid+1;
  94.         }
  95.         cout << l << endl;
  96.         return;
  97.     }*/
  98.     if(n == 1){
  99.         cout << 1 << endl;
  100.         return;
  101.     }
  102.     if(n == 2){
  103.         cout << 2 << endl;
  104.         return;
  105.     }
  106.     int res = 0;
  107.     int vel = n-1;
  108.     res = 1;
  109.     for(int i=1; i<=cnt; i++){
  110.         if(vel == 0)break;
  111.         res++;
  112.         int broj = sta[i];
  113.         int pomvel = (vel + broj - 1) / broj;
  114.         vel -= pomvel;
  115.         if(i == cnt){
  116.             cout << sta[i] << " " << pomvel << " " << vel+pomvel << endl;
  117.         }
  118.         if(pomvel == 1){
  119.             break;
  120.         }
  121.     }
  122.     res += vel;
  123.     cout << res << endl;
  124. }
  125.  
  126.  
  127. int main(){
  128.     ios_base::sync_with_stdio(false), cin.tie(0);
  129.  
  130.     int n;
  131.     n = 418*1e5;
  132.     init(1, 1, MAX);
  133.     /// ne zaboravi da dodas 1, 2, 3 u niz
  134.     sta[++cnt] = 2;
  135.     sta[++cnt] = 3;
  136.     int kurac = 2;
  137.     for(int i=5; i<=n; i+=6-kurac){
  138.         updseg(1, 1, MAX, 1, cnt, -1);
  139.         if(seg[1].val+seg[1].lazy){
  140.             sta[++cnt] = i;
  141.             updpoint(1, 1, MAX, cnt, sta[cnt]);
  142.         }
  143.         else{
  144.             int k = seg[1].koji;
  145.             updseg(1, 1, MAX, k+1, cnt, 1);
  146.             updpoint(1, 1, MAX, k, sta[k]);
  147.         }
  148.         kurac = 6-kurac;
  149.     }
  150.     //cout << cnt+3 << endl;
  151.     int t;
  152.     cin >> t;
  153.     while(t--)solve();
  154.     return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement