Advertisement
Guest User

Signal Tower

a guest
Aug 14th, 2013
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.45 KB | None | 0 0
  1. /*===============*\
  2. |  ID: TMANDZU    |
  3. |    LANG: C++    |
  4. \*===============*/
  5. //Tornike Mandzulashvili
  6. //#pragma comment(linker,"/STACK:256000000")
  7. #include <stdio.h>
  8. #include <algorithm>
  9. #include <iostream>
  10.  
  11. #define EPS 0.000000001
  12. #define Pi 3.1415926535897932384626433832795028841971
  13. #define hash1 1000003
  14. #define hash2 1000033
  15. #define md 1000000007
  16. #define INF 1000000500
  17. #define mp make_pair
  18. #define pb push_back
  19. #define S size()
  20. #define MX(aa,bb) (aa>bb?aa:bb)
  21. #define MN(aa,bb) (aa<bb?aa:bb)
  22. #define fi first
  23. #define se second
  24. #define PI pair < int,int >
  25. #define REP(i,a,n) for(i=a;i<n;i++)
  26. #define sc scanf
  27. #define pt printf
  28. #define big long long
  29. #define VI vector <int>
  30. #define DID (long long)
  31.  
  32.  
  33. using namespace std;
  34.  
  35. const int T=100005;
  36.  
  37. int L[T],R[T],A[T],B[T];
  38. long long f[T],d[T];
  39. int a,b,ll,rr,mid,i,N,Q;
  40. long long x;
  41. long long answer[T];
  42. long long s[2][18][T],v[2][18][T];
  43. PI I[T];
  44.  
  45. struct node
  46. {
  47.     int l,r;
  48.     long long sum;
  49. };
  50.  
  51. node g[2][4*T];
  52.  
  53. void build(int a,int b,int u,int deg,int n)
  54. {
  55.     g[n][u].l=a;g[n][u].r=b;
  56.  
  57.     if (a==b)
  58.     {
  59.         if (!n){
  60.         g[n][u].sum=d[a];
  61.         v[n][deg][a]=d[a];
  62.         s[n][deg][a]=d[a];}else
  63.         {
  64.             v[n][deg][a]=I[a].se;
  65.         }
  66.         return;
  67.     }
  68.  
  69.     int mid=(a+b)>>1;
  70.     build(a,mid,2*u,deg+1,n);
  71.     build(mid+1,b,2*u+1,deg+1,n);
  72.  
  73.     int ll=a,llend=mid;
  74.     int rr=mid+1,rrend=b;
  75.  
  76.     for (int i=a;i<=b;i++)
  77.     if (ll==llend+1) v[n][deg][i]=v[n][deg+1][rr++]; else
  78.     if (rr==rrend+1) v[n][deg][i]=v[n][deg+1][ll++]; else
  79.     if (v[n][deg+1][ll]<v[n][deg+1][rr]) v[n][deg][i]=v[n][deg+1][ll++]; else v[n][deg][i]=v[n][deg+1][rr++];
  80.  
  81.     s[n][deg][a]=v[n][deg][a];
  82.     for (int i=a+1;i<=b;i++)
  83.     s[n][deg][i]= DID s[n][deg][i-1]+v[n][deg][i];
  84.  
  85.     g[n][u].sum=s[n][deg][b];
  86. }
  87.  
  88. int go(int u,int deg,int n)
  89. {
  90.     if (g[n][u].l>b || a>g[n][u].r) return 0;
  91.     if (a<=g[n][u].l && g[n][u].r<=b) return g[n][u].r+1-(lower_bound(v[n][deg]+g[n][u].l,v[n][deg]+g[n][u].r+1,x)-v[n][deg]);
  92.     return go(2*u,deg+1,n)+go(2*u+1,deg+1,n);
  93. }
  94.  
  95. long long get(int u,int deg,int n)
  96. {
  97.     if (g[n][u].l>b || a>g[n][u].r) return 0;
  98.     if (a<=g[n][u].l && g[n][u].r<=b) {
  99.             int p=lower_bound(v[n][deg]+g[n][u].l,v[n][deg]+g[n][u].r+1,x)-v[n][deg];
  100.             long long h=0;
  101.             if (p>g[n][u].l)
  102.             h+= DID (p-g[n][u].l)*x-s[n][deg][p-1];
  103.             if (p>g[n][u].l)
  104.             h+=DID ( DID g[n][u].sum-s[n][deg][p-1])- DID (g[n][u].r+1-p)*x; else
  105.             h+=DID ( DID g[n][u].sum)- DID (g[n][u].r+1-p)*x;
  106.             return h;
  107.     }
  108.     return DID get(2*u,deg+1,n)+get(2*u+1,deg+1,n);
  109. }
  110.  
  111. bool check(int X)
  112. {
  113.     x=f[X];
  114.     a=L[i];
  115.     b=R[i];
  116.     return (go(1,0,0)>=(R[i]-L[i]+2)/2);
  117. }
  118.  
  119. int countt(int u,int deg,int n)
  120. {
  121.     int LL=g[n][u].l;
  122.     int RR=g[n][u].r;
  123.  
  124.   //  cout<<"l da r "<<LL<<" "<<RR<<" "<<(upper_bound(v[n][deg]+LL,v[n][deg]+RR+1,b)-lower_bound(v[n][deg]+LL,v[n][deg]+RR+1,a))<<endl;
  125.  
  126.     return (upper_bound(v[n][deg]+LL,v[n][deg]+RR+1,b)-lower_bound(v[n][deg]+LL,v[n][deg]+RR+1,a));
  127. }
  128.  
  129. int godown(int raod,int u,int deg,int n)
  130. {
  131.   //  cout<<u<<endl;
  132.     if (g[n][u].l==g[n][u].r) return g[n][u].r;
  133.     int h=countt(2*u,deg+1,n);
  134.  
  135.   //  cout<<raod<<" "<<u<<" "<<h<<endl;
  136.  
  137.     if (h>=raod) return godown(raod,2*u,deg+1,n);else return godown(raod-h,2*u+1,deg+1,n);
  138. }
  139.  
  140. void solve()
  141. {
  142.     build(1,N,1,0,0);
  143.     for (i=1;i<=N;i++)
  144.     f[i]=d[i];
  145.     sort(f+1,f+N+1);
  146.  
  147.     for (i=1;i<=N;i++)
  148.     I[i]=mp(d[i],i);
  149.     sort(I+1,I+N+1);
  150.  
  151.   //  cout<<"ARRAY "<<"\n";
  152.   //  for (i=1;i<=N;i++)
  153.  //   cout<<I[i].fi<<" ";
  154.   //  cout<<endl;
  155.  
  156.     build(1,N,1,0,1);
  157.  
  158.   //  cout<<"% SHIA "<<g[1][5].l<<" "<<g[1][5].r<<endl;
  159.  
  160.     for (i=1;i<=Q;i++)
  161.     {
  162.         a=L[i];
  163.         b=R[i];
  164.  
  165.         ll=godown((b-a+2)/2,1,0,1);
  166.         x=I[ll].fi;
  167.  
  168.    //     cout<<"---"<<a<<" "<<b<<" "<<ll<<" "<<x<<endl;
  169.  
  170.         answer[i]+=get(1,0,0);
  171.     }
  172. }
  173.  
  174. main()
  175. {
  176.    // freopen("text.in","r",stdin);   freopen("text.out","w",stdout);
  177.  
  178.     scanf("%d %d",&N,&Q);
  179.     for (i=1;i<=N;i++)
  180.     scanf("%d",A+i);
  181.     for (i=1;i<=N;i++)
  182.     scanf("%d",B+i);
  183.     for (i=1;i<=Q;i++)
  184.     scanf("%d %d",L+i,R+i);
  185.  
  186.     for (i=1;i<=N;i++)
  187.     d[i]=DID A[i]+B[i];
  188.  
  189.     solve();
  190.  
  191.     for (i=1;i<=N;i++)
  192.     d[i]=DID A[i]-B[i];
  193.  
  194.     solve();
  195.  
  196.     for (i=1;i<=Q;i++)
  197.     if (answer[i]%2) printf("%lld.50000\n",answer[i]/2);else
  198.     printf("%lld.0000\n",answer[i]/2);
  199.  
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement