Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # include <bits/stdc++.h>
- using namespace std;
- map <long long,long long> mp;
- long long S;
- long long m,n;
- long long calcArea(pair <long long,long long> A,pair <long long,long long> B)
- {
- long long x=(B.first+B.second+A.first-A.second);
- long long y= x+2*A.second-2*A.first;
- long long S=0;
- if(y<=2*m)
- {
- S+=(y+2*A.second)*(x-2*A.first);
- S+=(2*B.second+y)*(2*B.first-x);
- }
- else
- {
- long long x1=m+A.first-A.second;
- long long x2=B.second+B.first-m;
- S+=(m+A.second)*(x1-A.first);
- S+=2*(x2-x1)*m;
- S+=(m+B.second)*(B.first-x2);
- S=S*4;
- }
- return S;
- }
- bool isPointUp(pair <long long,long long> P,pair <long long,long long> A,pair <long long,long long> B)
- {
- pair <long long,long long> v1;
- v1.first=B.first-A.first;
- v1.second=B.second-A.second;
- pair <long long,long long> v2;
- v2.first=P.first-A.first;
- v2.second=P.second-A.second;
- long long cross=v1.first*v2.second-v1.second*v2.first;
- return cross>=0;
- }
- void update(long long x,long long y)
- {
- auto itr=mp.lower_bound(x);
- if(itr->first>=x&&x!=0)
- --itr;
- auto nextt=itr;
- ++nextt;
- S-=calcArea(*itr,*nextt);
- auto curr=itr;
- if(itr->first>0)
- {
- --curr;
- while(1)
- {
- if(isPointUp(*itr,{x-1,y+1},{x,y}))
- {
- S -= calcArea(*curr,*itr);
- mp.erase(itr);
- itr = curr;
- if(itr->first==0)
- break;
- --curr;
- }
- else
- break;
- }
- }
- if(itr->first==0)
- itr->second=min(itr->second,x+y);
- auto f=itr;
- itr=nextt;
- if(itr->first!=n)
- {
- ++nextt;
- while(1)
- {
- if(isPointUp(*itr,{x,y},{x+1,y+1}))
- {
- S-=calcArea(*itr,*nextt);
- mp.erase(itr);
- itr=nextt;
- if(itr->first==n)
- break;
- ++nextt;
- }
- else
- break;
- }
- }
- if(itr->first==n)
- {
- itr->second=min(itr->second,n+y-x);
- }
- auto l=itr;
- mp[x]=y;
- itr=mp.find(x);
- S+=calcArea(*f,*itr);
- S+=calcArea(*itr,*l);
- }
- void init(long long N,long long M)
- {
- n=N;
- m=M;
- mp[0]=m;
- mp[n]=m;
- S=calcArea({0,m},{n,m});
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- long long N,M;
- cin>>N>>M;
- init(N,M);
- long long Q;
- cin>>Q;
- long long x,y;
- while(Q--)
- {
- cin>>x>>y;
- update(x,y);
- double p=(double)S/8;
- printf("%.2f\n",p);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement