Advertisement
Iridescent_Cynosure

WA

Nov 13th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.91 KB | None | 0 0
  1.  
  2.  
  3.         /*----------------------------------*\
  4.         ******BISMILLAHIR RAHMANIR RAHIM******
  5.         ********************
  6.         *****************
  7.         /*************************************/
  8.  
  9. #include <bits/stdc++.h>
  10. using namespace std;
  11.  
  12. #define ll long long
  13. #define NL printf("\n")
  14. #define xx first
  15. #define yy second
  16. #define gc getchar
  17. #define pb push_back
  18. #define mp make_pair
  19. #define pii pair<int,int>
  20. #define scani(x) scanf("%d",&x)
  21. #define scanl(x) scanf("%lld",&x)//scanf("%I64d",&x)
  22. #define scand(x) scanf("%lf",&x)
  23. #define scans(x) scanf("%s",x)
  24. #define mem(a,b) memset(a,b,sizeof(a))
  25. #define FOR(i,j,k) for(i=j;i<=k;i++)
  26. #define REV(i,j,k) for(i=j;i>=k;i--)
  27. #define READ(f) freopen(f,"r",stdin)
  28. #define WRITE(f) freopen(f,"w",stdout)
  29. #define cnd tree[idx]
  30. #define lnd tree[idx*2]
  31. #define rnd tree[(idx*2)+1]
  32. #define lndp (idx*2),(b),((b+e)/2)
  33. #define rndp (idx*2+1),((b+e)/2+1),(e)
  34. #define pi 2.0*acos(0.0)
  35. #define MOD 1000000007
  36. #define MAX 100005
  37. #define PRINT_CASE(x) printf("Case %d:",cs);
  38.  
  39. #define sc1(a)  scanf("%lld",&a)
  40. #define sc2(a,b) scanf("%lld %lld",&a,&b)
  41. #define sc3(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
  42.  
  43. #define pi1(a) printf("%lld",a)
  44. #define pi2(a,b) printf("%lld %lld",a,b)
  45. #define pi3(a,b,c) printf("%lld %lld %lld",a,b,c)
  46. #define sp printf(" ")
  47. #define yes printf("YES")
  48. #define no printf("NO")
  49.  
  50. #define all(v) v.begin(),v.end()
  51.  
  52. template <typename T> inline T GCD (T a,T b ) {a = abs(a);b = abs(b);while ( b ) { a = a % b; swap ( a, b ); } return a;}
  53. template <typename T> inline T LCM(T x,T y){T tp = GCD(x,y);if( (x / tp) * 1. * y > 9e18) return 9e18;return (x / tp) * y;}
  54. template <typename T> inline T BigMod(T A,T B,T M){T ret = 1;while(B){if(B & 1) ret = (ret * A) % M;A = (A * A) % M;B = B >> 1;}return ret;}
  55. template <typename T> inline T InvMod (T A,T M){return BigMod(A,M-2,M);}
  56. ll gcdr ( ll a, ll b )
  57. {
  58.   if ( a==0 ) return b;
  59.   return gcdr ( b%a, a );
  60. }
  61. /*
  62. ll poW(ll x, ll n)
  63. {
  64.     if(n==0)
  65.         return 1;
  66.     else if(n%2==0)
  67.         return poW(x*x,n/2);
  68.     else
  69.         return x*poW(x*x,((n-1)/2));
  70. }
  71. */
  72. /*
  73. int gcdr ( int a, int b )
  74. {
  75.   if ( a==0 ) return b;
  76.   return gcdr ( b%a, a );
  77. }
  78.  
  79. const int maxx=1000000;
  80. int status[(maxx>>5)+2];
  81.  
  82. bool check(int N,int pos)
  83. {
  84.     return (bool)(N & (1<<pos));
  85. }
  86. int Set(int N, int pos)
  87. {
  88.     return N=(N|(1<<pos));
  89. }
  90. vector<int>P_list;
  91. void sieve()
  92. {
  93.     int i,j,sqrtN;
  94.     sqrtN=int(sqrt(maxx))+1;
  95.     P_list.push_back(2);
  96.     for(int i=3;i<=maxx;i+=2)
  97.     {
  98.         if(check(status[i>>5],i&31)==0)
  99.         {
  100.             P_list.push_back(i);
  101.  
  102.             if(i<=sqrtN)
  103.             for(j=i*i;j<=maxx;j+=(i<<1))
  104.             {
  105.                 status[j>>5]=Set(status[j>>5],j & 31);
  106.             }
  107.         }
  108.     }
  109. }
  110. */
  111. ll max(ll a,ll b){
  112.     if(a>b) return a;
  113.         return b;
  114. }
  115. ll min(ll a, ll b){
  116.     if(a<b)return a;
  117.             return b;
  118. }
  119. void FastIO()
  120. {
  121.     ios_base::sync_with_stdio(false);cin.tie(0);
  122.     cout.precision(20);
  123. }
  124. const ll size3=300005;
  125. const ll size2=200005;
  126. const ll size1=100005;
  127. /*
  128. void graph(ll n){
  129.     if(n==0) return ;
  130.     for(ll i=0;i<n;i++){
  131.         ll x,y;
  132.         sc2(x,y);
  133.         G[x].pb(y);
  134.         G[y].pb(x);
  135.     }
  136.     return ;
  137. }
  138. */
  139. ll tree[800005];
  140. vector<ll>mon;
  141. vector<pair<ll,ll> > hero;
  142. ll query(ll node, ll b, ll e,ll i,ll j){
  143.     if(i>e || j<b) return -1;
  144.     if(b>=i && e<=j){
  145.         return tree[node];
  146.     }
  147.     ll left = node * 2;
  148.     ll right = left + 1;
  149.     ll mid = (b+e)/2;
  150.     ll p1 = query(left,b,mid,i,j);
  151.     ll p2 = query(right,mid+1,e,i,j);
  152.     return  max(p1,p2);
  153. }
  154.  
  155. void init(ll node,ll b,ll e){
  156.     if(b==e){
  157.         tree[node] = mon[b-1];
  158.         return;
  159.     }
  160.     ll left = node * 2;
  161.     ll right = left + 1;
  162.     ll mid = (b+e)/2;
  163.     init(left,b,mid);
  164.     init(right,mid+1,e);
  165.     tree[node] = max(tree[left],tree[right]);
  166. }
  167. ll biggest[202000];
  168. int main()
  169. {
  170.     ///FastIO();
  171.     ll t,i,j,m,x,y,n;
  172.     sc1(t);
  173.     ll mx = -1;
  174.  
  175.     while(t--){
  176.         sc1(n);
  177.         mon.clear();
  178.         hero.clear();
  179.         mx = -1;
  180.         for(i=0;i<n;i++){
  181.             sc1(x);
  182.             mon.pb(x);
  183.             mx = max(mx,x);
  184.  
  185.         }
  186.         for(i=0;i<4*n;i++){
  187.             tree[i] = -1;
  188.         }
  189.         init(1,1,n);
  190.         sc1(m);
  191.         ll imp = 1;
  192.         for(i=0;i<m;i++){
  193.             sc2(x,y);
  194.             hero.pb(mp(y,x));
  195.             if(x>=mx){
  196.                 imp = 0;
  197.             }
  198.             biggest[i] = -1;
  199.         }
  200.         biggest[m+1] = -1;
  201.         biggest[m] = -1;
  202.         sort(all(hero));
  203.         vector<ll>day;
  204.         for(i=0;i<m;i++){
  205.             day.pb(hero[i].xx);
  206.         }
  207.         day.pb(1e15);
  208.         for(i=hero.size()-1;i>=0;i--){
  209.             biggest[i] = max(hero[i].yy,biggest[i+1]);
  210.         }
  211.         if(imp){
  212.             pi1(-1LL);NL;continue;
  213.         }
  214.         ll ans = 0;
  215.         ll completed = -1, target = n;
  216.         while(completed<(n-1)){
  217.             ll lower = completed + 1;
  218.             ll upper = n-1;
  219.             ans++;
  220.             ll pre = completed;
  221.             while(lower<=upper){
  222.                 ll mid = (lower+upper) / 2;
  223.                 ll maxx = query(1,1,n,pre+1,mid+1);
  224.                 //cout<<maxx<<endl;
  225.                 ll daySpend = (mid-pre);
  226.                 ll index = lower_bound(all(day),daySpend)- day.begin();
  227.                 if(day[index]==(1e15)){
  228.                     upper = mid - 1;
  229.  
  230.                     continue;
  231.                 }
  232.                 if(biggest[index]>=maxx){
  233.                     completed = mid ;
  234.                     lower = mid + 1;
  235.                    // cout<<"M"<<mid<<"||"<<daySpend<<endl;
  236.                 }
  237.                 else{
  238.                         //cout<<"EE"<<endl;
  239.                     upper = mid - 1;
  240.                 }
  241.  
  242.             }
  243.             //cout<<completed<<endl;getchar();
  244.         }
  245.         pi1(ans);NL;
  246.  
  247.     }
  248.  
  249.     return 0;
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement