Cod sursa(job #1938175)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 24 martie 2017 17:55:01
Problema Ograzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>
using namespace std;
#include <bits/stdc++.h>
using namespace std;
class InputReader {
    public:
        InputReader() {}
        InputReader(const char *file_name) {
            input_file = fopen(file_name, "r");
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
        inline InputReader &operator >>(int &n) {
            while((buffer[cursor] < '0' || buffer[cursor] > '9')&& buffer[cursor]!='-') {
                advance();
            }
            semn=1;
            if(buffer[cursor]=='-')
            {
                semn=-1;
                advance();
            }
            n = 0;
            while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
                n = n * 10 + buffer[cursor] - '0';
                advance();
            }
            n*=semn;
            return *this;
        }
    private:
        FILE *input_file;
        static const int SIZE = 1 << 20;
        int cursor,semn;
        char buffer[SIZE];
        inline void advance() {
            ++ cursor;
            if(cursor == SIZE) {
                cursor = 0;
                fread(buffer, SIZE, 1, input_file);
            }
        }
}f("ograzi.in");
ofstream g("ograzi.out");
int N,M,m,n,i,j,x,y,sol;
vector <pair <int,int> > O;
multiset <int> S;
struct pt
{
    int x;
    int Y;
}I[1<<16];
bool cmp(pt a,pt b)
{
    return a.x<b.x;
}
int main()
{
    f>>N>>M>>n>>m;
    for(i=1;i<=N;++i)
    {
        f>>x>>y;
        I[i]={x,y+m+1};
    }
    for(i=1;i<=M;++i)
    {
        f>>x>>y;
        ++y;
        O.push_back(make_pair(x,y));
    }
    sort(I+1,I+N+1,cmp);
    sort(O.begin(),O.end());
    int ins=1,ers=1,ver=0;
    for(i=0;ver<M;++i)
    {
        for(;I[ins].x==i&&ins<=N;++ins)
        {
            S.insert(I[ins].Y);
            ///g<<"bag :"<<I[ins].y<<'\n';
        }
        for(;ver<M;++ver)
            if(O[ver].first==i)
            {
                multiset <int> :: iterator it=S.lower_bound(O[ver].second);
                if(it!=S.end())
                {
                    ///g<<"cautat :"<<O[ver].second<<" gasit :"<<*it<<'\n';
                    sol+=(*it<=O[ver].second+m);
                }
            }
            else break;
        for(;I[ers].x+n==i&&ers<=N;++ers)
        {
            S.erase(S.find(I[ers].Y));
            ///g<<"scot :"<<E[ers].y<<'\n';
        }
    }
    g<<sol;
    return 0;
}