niyaznigmatullin

Untitled

Feb 2nd, 2014
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.52 KB | None | 0 0
  1.     private void solve() throws IOException {
  2.         int n = nextInt();
  3.         P = nextInt();  
  4.         long[] a = new long[n];
  5.         for (int i = 0; i < n; i++) {
  6.             a[i] = nextInt();
  7.         }
  8.         int[] l = new int[n];
  9.         long[] b = new long[n + 1];
  10.         Arrays.fill(b, Long.MAX_VALUE);
  11.         b[0] = Long.MIN_VALUE;
  12.         int max = 1;
  13.         for (int i = 0; i < n; i++) {
  14.             long x = a[i];
  15.             int k = bsearch(b, x);
  16.             b[k + 1] = Math.min(b[k + 1], x);
  17.             l[i] = k;
  18.             max = Math.max(max, k + 1);
  19.         }
  20.  
  21.         int[] cnt = new int[max];
  22.         for (int i : l) {
  23.             ++cnt[i];
  24.         }
  25.  
  26.         long[][] tab = new long[max][];
  27.         for (int i = 0; i < max; i++) {
  28.             tab[i] = new long[cnt[i]];
  29.         }
  30.         Arrays.fill(cnt, 0);
  31.         for (int i = 0; i < n; i++) {
  32.             tab[l[i]][cnt[l[i]]++] = a[i];
  33.         }
  34.         for (int i = 0; i < max; i++) {
  35.             Arrays.sort(tab[i]);
  36.         }
  37.  
  38.         long[][] ft = new long[max][];
  39.         for (int i = 0; i < max; i++) {
  40.             ft[i] = new long[cnt[i]];
  41.         }
  42.  
  43.         for (int i = 0; i < n; i++) {
  44.             long x = a[i];
  45.             int len = l[i];
  46.             int pos = bsearch(tab[len], x) + 1;
  47.             if (len == 0) {
  48.                 add(ft[len], pos, 1);
  49.             } else {
  50.                 int j = bsearch(tab[len - 1], x);
  51.                 long sum = sum(ft[len - 1], j);
  52.                 add(ft[len], pos, sum);
  53.             }
  54.         }
  55.         out.println(sum(ft[max - 1], ft[max - 1].length - 1));
  56.     }
  57.  
  58.     long P;
  59.  
  60.     long sum(long[] v, int x) {
  61.         long ans = 0;
  62.         while (x >= 0) {
  63.             ans = (ans + v[x]) % P;
  64.             x = ((x + 1) & x) - 1;
  65.         }
  66.         return ans;
  67.     }
  68.  
  69.     void add(long[] v, int x, long val) {
  70.         while (x < v.length) {
  71.             v[x] = (v[x] + val) % P;
  72.             x = (x + 1) | x;
  73.         }
  74.     }
Advertisement
Add Comment
Please, Sign In to add comment