Cod sursa(job #1938261)

Utilizator refugiatBoni Daniel Stefan refugiat Data 24 martie 2017 18:46:04
Problema Gropi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream si("gropi.in");
ofstream so("gropi.out");
int in[100005][4];
int cont;
pair<int,int>g[100005];
int cbin(int x)
{
    int st=1,dr=cont,mij,sol=-1;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(in[mij][1]<=x&&in[mij][2]>=x)
            return mij;
        else
            if(in[mij][1]>=x)
                dr=mij-1;
            else
                st=mij+1;
    }
}
int main()
{
    int c,n;
    si>>c>>n;
    for(int i=1;i<=n;++i)
        si>>g[i].second>>g[i].first;
    sort(g+1,g+n+1);
    in[++cont][0]=3-g[1].second;
    in[cont][1]=0;
    in[cont][2]=g[1].first-1;
    in[cont][3]=0;
    for(int i=2;i<=n;++i)
    {
        if(g[i].second!=g[i-1].second)
        {
            in[++cont][0]=g[i-1].second;
            in[cont][1]=in[cont-1][2]+1;
            in[cont][2]=g[i].first-1;
            in[cont][3]=i-1;
        }
    }
    in[++cont][0]=g[n].second;
    in[cont][1]=in[cont-1][2]+1;
    in[cont][2]=c;
    in[cont][3]=n;
    in[++cont][0]=3-g[n].second;
    in[cont][1]=in[cont-1][2]+1;
    in[cont][2]=c+5;
    in[cont][3]=n;
    /*
    for(int i=1;i<cont;++i)
    {
        cout<<in[i][0]<<' '<<in[i][1]<<' '<<in[i][2]<<' '<<in[i][3]<<'\n';
    }
    //*/
    int m;
    si>>m;
    int sum,g1,g2,a,b,d;
    for(int i=1;i<=m;++i)
    {
        si>>b>>a>>d>>c;
        if(a>c)
        {
            g1=a;
            g2=b;
            a=c;
            c=g1;
            b=d;
            d=g2;
        }
        g1=cbin(a);
        g2=cbin(c);
        sum=c-a+1;
        //cout<<g1<<' '<<g2<<'\n';
        //cout<<b<<' '<<in[g1][0]<<'\n';
        //cout<<sum<<' ';
        if(a>g[in[g1][3]].first)
        {
            if(b==in[g1][0])
                --sum;
        }
        else
            if(b==in[g1][0])
                ++sum;
        //cout<<sum<<' ';
        if(d==in[g2][0])
        {
            ++sum;
        }
        //cout<<sum<<' ';
        sum+=g2-g1;
        so<<sum<<'\n';
    }

    return 0;
}