Pagini recente » Cod sursa (job #701497) | Cod sursa (job #2175515) | Monitorul de evaluare | Cod sursa (job #2731586) | Cod sursa (job #2210305)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("file.in");
ofstream g ("file.out");
const int nmax=1e5+3;
int n,m;
struct usu1
{
int a1,b1,a2,b2;
}d[nmax];
struct usu2
{
int x,tip;
}p[nmax];
int mars[3*nmax],sol[nmax];
void solvetip1()
{
for(int i=1;i<=n;++i)
{
mars[d[i].a1]+=(d[i].b2-d[i].b1);
mars[d[i].a2+1]-=(d[i].b2-d[i].b1);
}
for(int i=1;i<=300000;++i) mars[i]+=mars[i-1];
for(int i=1;i<=m;++i) if(p[i].tip==1) sol[i]=mars[p[i].x]*mars[p[i].x];
}
int solvetip2(int x)
{
int sol=0,xt=0,a1=0,b1=0,a2=0,b2=0,l=0;
for(int i=1;i<=n;++i)
{
xt=x-d[i].b1;
a1=xt-d[i].a1;
b1=d[i].a2-xt;
xt=x-d[i].b2;
a2=xt-d[i].a1;
b2=d[i].a2-xt;
if(a1*b1<0&&a2*b2<0) continue;
l=d[i].b2-d[i].b1;
if(a1<=l&&a2<=l&&b1<=l&&b2<=l) sol+=l;
if(a1>l&&b1>0) sol+=b1;
if(a2>l&&b2>0) sol+=b2;
if(b1>l&&a1>0) sol+=a1;
if(b2>l&&a2>0) sol+=a2;
}
return 2*sol*sol;
}
int solvetip3(int x)
{
int sol=0,xt=0,a1=0,b1=0,a2=0,b2=0,l=0;
for(int i=1;i<=n;++i)
{
xt=x+d[i].b1;
a1=xt-d[i].a1;
b1=d[i].a2-xt;
xt=x+d[i].b2;
a2=xt-d[i].a1;
b2=d[i].a2-xt;
if(a1*b1<0&&a2*b2<0) continue;
l=d[i].b2-d[i].b1;
if(a1<=l&&a2<=l&&b1<=l&&b2<=l) sol+=l;
if(a1>l&&b1>0) sol+=b1;
if(a2>l&&b2>0) sol+=b2;
if(b1>l&&a1>0) sol+=a1;
if(b2>l&&a2>0) sol+=a2;
}
return 2*sol*sol;
}
int main()
{
f>>n;
for(int i=1;i<=n;++i)
{
f>>d[i].a1>>d[i].b1>>d[i].a2>>d[i].b2;
if(d[i].a1<=0)
{
d[i].a1+=100000;
d[i].a2+=100000;
}
}
f>>m;
for(int i=1;i<=m;++i)
{
f>>p[i].x>>p[i].tip;
if(p[i].x<=0) p[i].x+=100000;
}
solvetip1();
for(int i=1;i<=m;++i)
{
if(p[i].tip==1) continue;
if(p[i].tip==2)
{
sol[i]=solvetip2(p[i].x);
continue;
}
if(p[i].tip==3) sol[i]=solvetip3(p[i].x);
}
for(int i=1;i<=m;++i) g<<sol[i]<<'\n';
return 0;
}