Cod sursa(job #2210305)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 6 iunie 2018 10:10:56
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#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;
}