Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 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 == 1){
  88.         cout << 1 << endl;
  89.         return;
  90.     }
  91.     if(n == 2){
  92.         cout << 2 << endl;
  93.         return;
  94.     }
  95.     int res = 0;
  96.     int vel = n-1;
  97.     res = 1;
  98.     for(int i=1; i<=cnt; i++){
  99.         if(vel == 0)break;
  100.         res++;
  101.         int broj = sta[i];
  102.         int pomvel = (vel + broj - 1) / broj;
  103.         vel -= pomvel;
  104.         if(i == cnt){
  105.             cout << sta[i] << " " << pomvel << " " << vel+pomvel << endl;
  106.         }
  107.         if(pomvel == 1){
  108.             break;
  109.         }
  110.     }
  111.     res += vel;
  112.     cout << res << endl;
  113. }
  114.  
  115.  
  116. int main(){
  117.     ios_base::sync_with_stdio(false), cin.tie(0);
  118.  
  119.     int n;
  120.     n = 418*1e5;
  121.     init(1, 1, MAX);
  122.     /// ne zaboravi da dodas 1, 2, 3 u niz
  123.     sta[++cnt] = 2;
  124.     sta[++cnt] = 3;
  125.     int kurac = 2;
  126.     for(int i=5; i<=n; i+=6-kurac){
  127.         updseg(1, 1, MAX, 1, cnt, -1);
  128.         if(seg[1].val+seg[1].lazy){
  129.             sta[++cnt] = i;
  130.             updpoint(1, 1, MAX, cnt, sta[cnt]);
  131.         }
  132.         else{
  133.             int k = seg[1].koji;
  134.             updseg(1, 1, MAX, k+1, cnt, 1);
  135.             updpoint(1, 1, MAX, k, sta[k]);
  136.         }
  137.         kurac = 6-kurac;
  138.     }
  139.     //cout << cnt+3 << endl;
  140.     int t;
  141.     cin >> t;
  142.     while(t--)solve();
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement