Cod sursa(job #847803)

Utilizator razvan.popaPopa Razvan razvan.popa Data 4 ianuarie 2013 15:24:17
Problema Orase Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<bitset>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<algorithm>
#define infile "orase.in"
#define outfile "orase.out"
#define nMax 50005
#define INF (1 << 30)
#define pb push_back
#define mkp make_pair
#define pii pair<int, int>
#define ll long long
#define nxt (*it)
#define FOR(g)\
   for(vector<pii>::iterator it=g.begin(); it!=g.end(); ++it)
using namespace std;


struct oras{
    int dist, lg;
}v[nMax];

int N, M;

int Sol;


void read(){
    ifstream f(infile);

    f >> M >> N;

    for(int i=1; i<=N; ++i)
        f >> v[i].dist >> v[i].lg;

    f.close();
}


bool cmp(const oras &a, const oras &b){
    if(a.dist != b.dist)
       return a.dist < b.dist;
    return a.lg < b.lg;
}


int dfs(int idx, int x){
    if(idx > N)
       return -INF;

    int m1 = v[idx++].lg , m2 = 0;

    while(v[idx].dist == x){
        if(v[idx].lg > m1){ m2 = m1; m1 = v[idx].lg;}
        else if(v[idx].lg > m2) m2 = v[idx].lg;
        ++ idx;
    }

    int r = dfs(idx, v[idx].dist) + v[idx].dist - v[idx - 1].dist;

    if(r > m1){ m2 = m1; m1 = r; }
    else if(r > m2) m2 = r;

    Sol = max(Sol, m1 + m2);

    return m1;
}



void solve(){
    sort(v+1, v+N+1, cmp);

    dfs(1, v[1].dist);
}

void print(){
    ofstream g(outfile);

    g << Sol << '\n';

    g.close();
}

int main(){
  read();
  solve();
  print();

  return 0;
}