DSA Learning Series Week 2 ZCO12002

Can anyone please tell me what is the difference between this 2 solutions

#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false);cin.tie();cout.tie();
#define FILE_READ_IN freopen("input.txt","r",stdin);
#define FILE_READ_OUT freopen("output.txt","w",stdout);
using namespace std;
typedef long long ll;
int main(){
   #ifndef ONLINE_JUDGE 
  FILE_READ_IN 
  FILE_READ_OUT 
   #endif
int n,x,y; cin>>n>>x>>y;
vector<pair<int,int>> a;
for(int i=0;i<n;i++)
{
    int u,v; cin>>u>>v;
    a.push_back({u,v});
}
vector<int> x_val,y_val;
   for(int i=0;i<x;i++)
{
    int u; cin>>u;
    x_val.push_back(u);
}
for(int i=0;i<y;i++)
{
    int u; cin>>u;
    y_val.push_back(u);
}
sort(x_val.begin(),x_val.end());
sort(y_val.begin(),y_val.end());
int min_val=INT_MAX;
for(int i=0;i<n;i++)
{
    auto l=lower_bound(x_val.begin(),x_val.end(),a[i].first);
    auto u=lower_bound(y_val.begin(),y_val.end(),a[i].second);
    if(*l>a[i].first) l--;
    //cout<<*u<<" "<<*l<<"\n";
    if(*u>=a[i].second)
    min_val=min(min_val,*u-*l+1);
}
cout<<min_val<<"\n";
   return 0;

And the other solution is

#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false);cin.tie();cout.tie();
#define FILE_READ_IN freopen("input.txt","r",stdin);
#define FILE_READ_OUT freopen("output.txt","w",stdout);
using namespace std;
typedef long long ll;
int main(){
   #ifndef ONLINE_JUDGE 
      FILE_READ_IN 
      FILE_READ_OUT 
   #endif
    int n,x,y; cin>>n>>x>>y;
    vector<pair<int,int>> a;
    for(int i=0;i<n;i++)
    {
        int u,v; cin>>u>>v;
        a.push_back({u,v});
    }
    vector<int> x_val,y_val;
   for(int i=0;i<x;i++)
    {
        int u; cin>>u;
        x_val.push_back(u);
    }
    for(int i=0;i<y;i++)
    {
        int u; cin>>u;
        y_val.push_back(u);
    }
    sort(x_val.begin(),x_val.end());
    sort(y_val.begin(),y_val.end());
    int min_val=INT_MAX;
    for(int i=0;i<n;i++)
    {
        auto l=upper_bound(x_val.begin(),x_val.end(),a[i].first);
        auto u=lower_bound(y_val.begin(),y_val.end(),a[i].second);
        l--;
        //cout<<*u<<" "<<*l<<"\n";
        if(*u>=a[i].second)
        min_val=min(min_val,*u-*l+1);
    }
    cout<<min_val<<"\n";
   return 0;
}

In the 1st one I used lower_bound only, in 2nd I have used upper_bound and lower_bound, what’s the difference, 2nd is correct and 1st is wrong