Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. /***from dust i have come, dust i will be***/
  2.  
  3. #include<bits/stdc++.h>
  4.  
  5. typedef long long int ll;
  6. typedef unsigned long long int ull;
  7.  
  8. #define dbg printf("in\n")
  9. #define nl printf("\n")
  10. #define N 200010
  11. #define inf 1e9
  12.  
  13. #define sf(n) scanf("%d", &n)
  14. #define sff(n,m) scanf("%d%d",&n,&m)
  15. #define sfl(n) scanf("%I64d", &n)
  16. #define sffl(n,m) scanf("%I64d%I64d",&n,&m)
  17.  
  18. #define pf(n) printf("%d",n)
  19. #define pff(n,m) printf("%d %d",n,m)
  20. #define pffl(n,m) printf("%I64d %I64d",n,m)
  21. #define pfl(n) printf("%I64d",n)
  22. #define pfs(s) printf("%s",s)
  23.  
  24. #define pb push_back
  25. #define pp pair<int, int>
  26.  
  27. using namespace std;
  28.  
  29. int a[N], segTree[N * 4];
  30. pp h[N];
  31.  
  32. void build(int at, int l, int r)
  33. {
  34.     if(l == r)
  35.     {
  36.         segTree[at] = h[l - 1].second;
  37.         return;
  38.     }
  39.  
  40.     int mid = (l + r) / 2;
  41.  
  42.     build(at * 2, l, mid);
  43.     build(at *2 + 1, mid + 1, r);
  44.  
  45.     int x = segTree[at * 2];
  46.     int y = segTree[at * 2 + 1];
  47.  
  48.     segTree[at] = max(x, y);
  49. }
  50.  
  51. // we are now in the range L-R in the tree
  52. // we are given l-r as the query in the input
  53. int query(int at, int L, int R, int l, int r)
  54. {
  55.     // out of range
  56.     if(r < L || R < l) return 0;
  57.  
  58.     // completely in range
  59.     if(l <= L && R <= r)
  60.         return segTree[at];
  61.  
  62.     int mid = (L + R) / 2;
  63.     int x = query(at * 2, L, mid, l, r);
  64.     int y = query(at * 2 + 1, mid + 1, R, l, r);
  65.  
  66.     return max(x, y);
  67. }
  68.  
  69. int main()
  70. {
  71.     freopen("in.txt", "r", stdin);
  72.  
  73.     int i, j, k;
  74.     int idx, jdx, kdx;
  75.     int n, m, t;
  76.     int mx, mx_pow_soFar, endurance;
  77.  
  78.     sf(t);
  79.     while(t--)
  80.     {
  81.         sf(n);
  82.  
  83.         mx = 0;
  84.         for(i = 0; i < n; i++)
  85.             sf(a[i]), mx = max(a[i], mx);
  86.  
  87.         sf(m); k = 0;
  88.         for(i = 0; i < m; i++)
  89.             sff(h[i].first, h[i].second), k = max(k, h[i].first);
  90.  
  91.         if(mx > k)
  92.         {
  93.             pf(-1); nl;
  94.             continue;
  95.         }
  96.  
  97.         sort(h, h + m);
  98.         build(1, 1, m);
  99.  
  100.         int ans = 0;
  101.         i = 0;
  102.  
  103.         while(i < n)
  104.         {
  105.             ans++;
  106.  
  107.             mx_pow_soFar = a[i];
  108.             endurance = 1;
  109.  
  110.             // now check how far we can go
  111.             for(j = i + 1; j < n; j++)
  112.             {
  113.                 endurance++;
  114.                 mx_pow_soFar = max(mx_pow_soFar, a[j]);
  115.  
  116.                 jdx = lower_bound(h, h + m, make_pair(mx_pow_soFar, 1)) - h;
  117.  
  118.                 // now from jdx to n - 1 search for someone who has the required endurance
  119.                 kdx = query(1, 1, m, jdx + 1, m);
  120.  
  121.                 if(kdx < endurance) break;
  122.             }
  123.  
  124.             i = j;
  125.         }
  126.  
  127.         pf(ans); nl;
  128.     }
  129.  
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement