Advertisement
Guest User

Untitled

a guest
Oct 9th, 2015
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. const int K = 18;
  6.  
  7. int alpha[(1<<K)] ;
  8. bool actual[1<<K];
  9. int fillval[1<<K];
  10.  
  11.  
  12. const int inf = (int)1e9;
  13.  
  14. void push(int v, int vl, int vr)
  15. {
  16.     if (vl + 1 == vr) return;
  17.     if (actual[v]) return;
  18.     actual[v*2] = actual[v*2+1] = 0;
  19.     fillval[v*2] = fillval[v*2+1] = fillval[v];
  20.     alpha[v*2] = alpha[v*2+1] = fillval[v];
  21.     actual[v] = 1; 
  22. }
  23.  
  24. void intchange(int v, int vl, int vr, int ql, int qr, int val)
  25. {
  26.     push(v, vl, vr);
  27.     if (vr <= ql || vl >= qr) return;
  28.     if (vl >= ql && vr <= qr)
  29.     {
  30.         actual[v] = 0;
  31.         alpha[v] = val;
  32.         fillval[v] = val;
  33.         return;
  34.     }
  35.    
  36.     intchange(v*2, vl, (vl+vr)/2, ql, qr, val);
  37.     intchange(v*2+1, (vl+vr)/2, vr, ql, qr, val);
  38.     alpha[v] = max(alpha[v*2], alpha[v*2+1]);
  39.    
  40. }
  41.  
  42. int getmax(int v, int vl, int vr, int ql, int qr)
  43. {
  44.     push(v, vl, vr);
  45.     if (vr <= ql || vl >= qr) return -inf;
  46.     if (vl >= ql && vr <= qr) return alpha[v];
  47.     int ans = max(getmax(v*2, vl, (vl+vr)/2, ql, qr),
  48.            getmax(v*2+1, (vl+vr)/2, vr, ql, qr));
  49.     return ans;
  50. }
  51.  
  52. int a[1<<K], dp[1<<K];
  53. int main()
  54. {
  55.     int n;
  56.     cin >> n;
  57.     cin >> a[0];
  58.     int k,b,m;
  59.     cin >> k >> b >> m;
  60.     for (int i = 1; i < n; i++) a[i] = (a[i-1]*k+b) % m;
  61.     // последовательность задана странно
  62.    
  63.    
  64.     for (int i = 0; i < (1<<K); i++) alpha[i] = -inf;
  65.     int ans = 0;
  66.     for (int i = 0; i < n; i++)
  67.     {
  68.         dp[i] = max(1, getmax(1,0,(1<<(K-1)), 0, a[i]) + 1);
  69.         ans = max(ans, dp[i]);
  70.         intchange(1, 0, (1<<(K-1)), a[i], a[i]+1, dp[i]);
  71.        
  72.     }
  73.     cout << ans << endl;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement