Cod sursa(job #2379812)

Utilizator VasileAmbreiajVasile Ambreiaj VasileAmbreiaj Data 14 martie 2019 08:53:20
Problema Triplete Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("triplete.in");
ofstream g("triplete.out");

struct vaci{
    int a,b;
}v[140000];

int pp[4100],pu[4100];
long long nrt;

bool cond(vaci A, vaci B){
    if(A.a!=B.a)
        return A.a<B.a;
    return A.b<B.b;
}

bool caubin(int j, int i){
    int st=pp[v[j].b],dr=pu[v[j].b],m;

    while(st<=dr){
        m=(st+dr)/2;

        if(v[m].b==v[i].a)
            return 1;
        else if(v[m].b<v[i].a)
            st=m+1;
        else dr=m-1;
    }

    return 0;
}

int main()
{
    int n,m,lv=0,i,j;

    f>>n>>m;

    for(i=1;i<=m;++i){
        ++lv;
        f>>v[lv].a>>v[lv].b;
        ++lv;
        v[lv].a=v[lv-1].b;
        v[lv].b=v[lv-1].a;
    }

    sort(v+1,v+lv+1,cond);

    int u=1;

    for(i=1;i<=lv;++i){
        if(v[i].a==u && pp[u]==0){
            pp[u]=i;
        }
        if(i==lv || v[i+1].a!=u){
            pu[u]=i;
            ++u;
        }
    }

    for(i=1;i<=lv;++i){
        if(v[i].a>v[i].b)
            continue;
        for(j=pp[v[i].b];j<=pu[v[i].b];++j){
            if(v[j].a>v[j].b)
                continue;
            if(caubin(j,i)){
                ++nrt;
            }
        }
    }

    g<<nrt;

    return 0;
}