Guest User

Untitled

a guest
Mar 15th, 2016
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const long long mod = 1e9+7;
  4. const double eps = 1e-15;
  5. double PI = 3.14159265359;
  6. #define readFile freopen("input","r",stdin)
  7. #define writeFile freopen("output","w",stdout)
  8. #define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  9. typedef pair<long long,long long> ii;
  10. typedef unsigned long long ULL;
  11. const long long INF = 1e8;
  12. const int N =800001,N1 = 400001;
  13.  
  14. int _len,_ways;
  15. #define pnode Node*
  16.  
  17.  
  18. ii mx(ii a,ii b){
  19.     if (a.first>b.first) return a;
  20.     if (a.first<b.first) return b;
  21.     return make_pair(a.first,b.second+a.second);
  22. }
  23.  
  24. struct seg{
  25.     ii ls[N*2];
  26.     seg(){
  27.         for(int i=0;i<N*2;i++) ls[i]=make_pair(0,0);
  28.     }
  29.     ii ls_query(int node,int l,int r,int ll,int rr){
  30.     if(l>rr || r<ll || r<l || rr<ll) return make_pair(0,0);
  31.     if (l>=ll && r<=rr) return ls[node];
  32.     int mid = (l+r)>>1;
  33.     ii q1 = ls_query(node<<1,l,mid,ll,rr);
  34.     ii q2 = ls_query(node<<1|1,mid+1,r,ll,rr);
  35.     return mx(q1,q2);
  36. }
  37. ii lds_query(int node,int l,int r,int ll,int rr){
  38.     if(l>rr || r<ll || r<l || rr<ll) return make_pair(0,0);
  39.     if (l>=ll && r<=rr) return ls[node];
  40.     int mid = (l+r)>>1;
  41.     ii q1 = lds_query(node<<1,l,mid,ll,rr);
  42.     ii q2 = lds_query(node<<1|1,mid+1,r,ll,rr);
  43.     return mx(q1,q2);
  44. }
  45.  
  46. ii ls_ins(int node,int l,int r,int idx,ii val){
  47.     if (l==r){
  48.         if (val.first == ls[node].first-1) ls[node].second+=val.second;
  49.         else if (ls[node].first-1<val.first) ls[node] = val,ls[node].first++;
  50.         return ls[node];
  51.     }
  52.     int mid = (l+r)>>1;
  53.     ii res;
  54.     if (idx<=mid) res = ls_ins(node<<1,l,mid,idx,val);
  55.     else res = ls_ins(node<<1|1,mid+1,r,idx,val);
  56.     ls[node] = mx(ls[node<<1],ls[node<<1|1]);
  57.     return res;
  58. }
  59. ii lds_ins(int node,int l,int r,int idx,ii val){
  60.     if (l==r){
  61.         if (val.first == ls[node].first-1) ls[node].second+=val.second;
  62.         else if (ls[node].first-1<val.first) ls[node] = val,ls[node].first++;
  63.         return ls[node];
  64.     }
  65.     int mid = (l+r)>>1;
  66.     ii res;
  67.     if (idx<=mid) res = lds_ins(node<<1,l,mid,idx,val);
  68.     else res = lds_ins(node<<1|1,mid+1,r,idx,val);
  69.     ls[node] = mx(ls[node<<1],ls[node<<1|1]);
  70.     return res;
  71. }
  72. };
  73.  
  74. struct Node{
  75.     int len,ways;
  76.     pnode l,*r;
  77.    
  78.     Node(){
  79.         l=r=NULL;
  80.         len = ways = 0;
  81.     }
  82.    
  83.     Node(ii val){
  84.         l =r = NULL;
  85.         this->len = val.first;
  86.         this->ways = val.second;
  87.     }
  88.     Node(pnode l,pnode r){
  89.         this->l = l;
  90.         this->r = r;
  91.         if (l->len > r->len){
  92.             this->len = l->len;
  93.             this->ways = l->ways;
  94.         }
  95.         else if (l->len < r->len){
  96.             this->len = r->len;
  97.             this->ways = r->ways;
  98.         }
  99.         else{
  100.             this->len = r->len;
  101.             this->ways = r->ways+l->ways;
  102.         }
  103.     }
  104.    
  105.     ii pr(){return make_pair(len,ways);}
  106. };
  107.  
  108. pnode rroots[N1];
  109. pnode lroots[N1];
  110.  
  111.  
  112. pnode build(int l,int r){
  113.     if (l==r) return new Node();
  114.     int mid = (l+r)>>1;
  115.     return new Node(build(l,mid),build(mid+1,r));
  116. }
  117.  
  118. pnode insert(pnode node,int l,int r,int idx,ii val){
  119.     if (l==r) return new Node(val);
  120.     int mid = (l+r)>>1;
  121.     if (idx<=mid) return new Node(insert(node->l,l,mid,idx,val),node->r);
  122.     return new Node(node->l,insert(node->r,mid+1,r,idx,val));
  123. }
  124.  
  125. ii query(pnode node,int l,int r,int ll,int rr){
  126.     if (l>rr || r<ll) return make_pair(0,0);
  127.     if (l>=ll && r<=rr) return node->pr();
  128.     int mid = (l+r)>>1;
  129.     ii q1 = query(node->l,l,mid,ll,rr);
  130.     ii q2 = query(node->r,mid+1,r,ll,rr);
  131.     return mx(q1,q2);
  132. }
  133.  
  134.  
  135. ii lef[N/2],ri[N/2];
  136. int arr[N/2];
  137. ii q[N/2];
  138. int n,m,pntr;
  139.  
  140. void rc(){
  141.     pair<int,ii> comps[N];
  142.     cin>>n>>m;
  143.     for(int i=1;i<=n;i++){
  144.         cin>>comps[i].first;
  145.         comps[i].second.first = i;
  146.         comps[i].second.second = 0;
  147.     }
  148.     for(int i=1;i<=m;i++){
  149.         int a,b;
  150.         cin>>a>>b;
  151.         comps[n+i].first = b;
  152.         comps[n+i].second = make_pair(i,a);
  153.     }
  154.     sort(comps+1,comps+n+m+1);
  155.     pntr = 0;
  156.     for(int i=1;i<=n+m;i++){
  157.         if (comps[i].first!=comps[i-1].first){
  158.             pntr++;
  159.         }
  160.         if (!comps[i].second.second)
  161.             arr[comps[i].second.first] = pntr;
  162.         else q[comps[i].second.first] = make_pair(comps[i].second.second,pntr);
  163.     }
  164. }
  165.  
  166. int res_query(int a,int x){
  167.     ii q1 =  query(rroots[a-1],1,pntr,1,x-1);
  168.     ii q2 = query(lroots[a+1],1,pntr,x+1,pntr);
  169.     int tmp = q1.first+q2.first+1;
  170.     if (tmp>=_len) return tmp;
  171.     if (ri[a].first + lef[a].first -1 <_len) return _len;
  172.     if (ri[a].second*lef[a].second == _ways) return _len-1;
  173.     return _len;
  174. }
  175.  
  176. void process(){
  177.     seg ls = seg();
  178.     for(int i=1;i<=n;i++){
  179.         ii tmp = ls.ls_query(1,1,pntr,1,arr[i]-1);
  180.         if (!tmp.first) tmp = make_pair(0,1);
  181.         ri[i] = ls.ls_ins(1,1,pntr,arr[i],tmp);
  182.         rroots[i] = insert(rroots[i-1],1,pntr,arr[i],ri[i]);
  183.         ri[i].second = tmp.second;
  184.     }
  185.     _len = ls.ls[1].first,_ways = ls.ls[1].second;
  186.     for(int i=0;i<N*2;i++) ls.ls[i] = make_pair(0,0);
  187.     for(int i=n;i>0;i--){
  188.         ii tmp = ls.lds_query(1,1,pntr,arr[i]+1,N);
  189.         if (!tmp.first) tmp = make_pair(0,1);
  190.         lef[i] = ls.lds_ins(1,1,pntr,arr[i],tmp);
  191.         lroots[i] = insert(lroots[i+1],1,pntr,arr[i],lef[i]);
  192.         lef[i].second = tmp.second;
  193.     }
  194. }
  195.  
  196. int main(){
  197. #ifndef ONLINE_JUDGE
  198.     readFile;
  199. //    writeFile;
  200. #endif
  201.     fastIO;
  202.     rc();
  203.     rroots[0] = build(1,pntr);
  204.     lroots[n+1] = build(1,pntr);
  205.     process();
  206.     for(int i=1;i<=m;i++){
  207.         cout<<res_query(q[i].first,q[i].second)<<"\n";
  208.     }
  209. }
Add Comment
Please, Sign In to add comment