Cod sursa(job #2436353)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 5 iulie 2019 15:51:07
Problema Orase Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define NMAX 50000

using namespace std;

int aintmin[4 * NMAX + 1];
int aintmax[4 * NMAX + 1];

struct oras{
  int st, dr;
}v[NMAX + 1];

void update( int v[], int node, int st, int dr, int poz, int val, bool cond ) {
  if( st == dr ) {
    v[node] = val;
    return ;
  }
  int mid = ( st + dr ) / 2;
  if( poz <= mid )
    update(v, 2 * node, st, mid, poz, val, cond);
  else
    update(v, 2 * node + 1, mid + 1, dr, poz, val, cond);
  if( cond )
    v[node] = max(v[2 * node],v[2 * node + 1]);
}

int query( int v[], int node, int st, int dr, int left, int right, bool cond ) {
  if( st == left && dr == right )
    return v[node];
  int mid = ( st + dr ) / 2;
  if( right <= mid  )
    return query(v,2*node,st,mid,left,right, cond);
  else if( left > mid )
    return query(v, 2 * node + 1, mid + 1, dr, left, right, cond);
  else {
    if( cond )
      return max( query(v, 2 * node, st, mid, left, mid, cond), query(v, 2 * node + 1, mid + 1, dr, mid + 1, right, cond) );
    else
      return min( query(v, 2 * node, st, mid, left, mid, cond), query(v, 2 * node + 1, mid + 1, dr, mid + 1, right, cond) );
  }
}

bool cmp( oras a, oras b ) {
  return a.st < b.st;
}

int main() {
    ifstream fin("orase.in");
    ofstream fout("orase.out");
    int n, i, m;
    fin>>m>>n;
    for( i = 1; i <= n; i ++ )
      fin>>v[i].st>>v[i].dr;
    sort( v + 1, v + n + 1, cmp );
    for( i = 1; i <= n; i ++ ) {
      update(aintmin, 1, 1, n, i, v[i].st - v[i].dr, 0);
      update(aintmax, 1, 1, n, i, v[i].st + v[i].dr, 1);
    }
    int maxdist = 0;
    for( i = 2; i < n; i ++ ) {
      int x = query(aintmin, 1, 1, n, 1, i - 1,0);
      x = v[i].st + v[i].dr - x;
      maxdist = max( maxdist, x );
      x = query(aintmax, 1, 1, n, i + 1, n, 1);
      x = x - ( v[i].st - v[i].dr );
      maxdist = max( maxdist, x );
    }
    fout<<maxdist;
    return 0;
}