Problem p00099 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <algorithm>
#include <iostream>
#include <set>
#include <vector>
using namespace std;

/*
const int INF   = 1 << 29;
const int MAX_N = 1000001;

// Segment Tree
// (数列のサイズ N に対してSegment Treeの頂点は 2*N-1 となる)
struct Seg_tree{
        int n;
        vector<int> dat;
        // コンストラクタで初期化
        Seg_tree(int n_){
                // 簡単のために要素数を2のべき乗にする
                n = 1;
                while( n < n_ ) n *= 2;
                // すべての頂点の値を -INF にする
                for(int i = 0; i < 2 * n - 1; i++){
                        dat.push_back(-INF);
                }
        }
        // k 番目の値 (0-indexed) を a に更新
        void update(int k, int a){
                k += n - 1;
                dat[k] = a;
                // 登りながら更新
                while( k > 0 ){
                        k = (k - 1) / 2;
                        dat[k] = max(dat[k * 2 + 1], dat[k * 2 + 2]);
                }
        }
        // [a,b)の最小値を求める
        int query(int a, int b, int k=0, int l=0, int r=-INF){
                // 初回呼び出し時
                if( k == 0 && l == 0 && r == -INF ) r = n;

                // [a,b) と [l,r) が交差しないとき
                if( r <= a || b <= l ) return -INF;

                // [a,b) が [l,r) を完全に含んでいるとき
                if( a <= l && r <= b ){
                        return dat[k];
                }else{ // それ以外
                        int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
                        int vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
                        return max(vl, vr);
                }
        }
};
*/

// s[k] := k匹釣った人の集合
set<int> s[500001];
// id[k] := 番号 k の人が釣った数
int id[1000000] = {0};

int main() {
  int n, q, x = 0, y = 0;
  cin >> n >> q;

  for (int i = 0; i < n; i++)
    s[0].insert(i);

  for (int i = 0; i < q; i++) {
    int a, v;
    cin >> a >> v;
    a--;
    int prev = id[a];
    int next = id[a] + v;
    x = min(x, next);
    y = max(y, next);
    s[prev].erase(a);
    s[next].insert(a);
    for (int k = y; k >= x; k--) {
      if (s[k].size()) {
        cout << ((*s[k].begin()) + 1) << " " << k << endl;
        break;
      } else {
        y = k;
      }
    }

    id[a] = next;
  }
}

Fixed submission:
#include <algorithm>
#include <iostream>
#include <set>
#include <vector>
using namespace std;

/*
const int INF   = 1 << 29;
const int MAX_N = 1000001;

// Segment Tree
// (数列のサイズ N に対してSegment Treeの頂点は 2*N-1 となる)
struct Seg_tree{
        int n;
        vector<int> dat;
        // コンストラクタで初期化
        Seg_tree(int n_){
                // 簡単のために要素数を2のべき乗にする
                n = 1;
                while( n < n_ ) n *= 2;
                // すべての頂点の値を -INF にする
                for(int i = 0; i < 2 * n - 1; i++){
                        dat.push_back(-INF);
                }
        }
        // k 番目の値 (0-indexed) を a に更新
        void update(int k, int a){
                k += n - 1;
                dat[k] = a;
                // 登りながら更新
                while( k > 0 ){
                        k = (k - 1) / 2;
                        dat[k] = max(dat[k * 2 + 1], dat[k * 2 + 2]);
                }
        }
        // [a,b)の最小値を求める
        int query(int a, int b, int k=0, int l=0, int r=-INF){
                // 初回呼び出し時
                if( k == 0 && l == 0 && r == -INF ) r = n;

                // [a,b) と [l,r) が交差しないとき
                if( r <= a || b <= l ) return -INF;

                // [a,b) が [l,r) を完全に含んでいるとき
                if( a <= l && r <= b ){
                        return dat[k];
                }else{ // それ以外
                        int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
                        int vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
                        return max(vl, vr);
                }
        }
};
*/

// s[k] := k匹釣った人の集合
set<int> s[100001];
// id[k] := 番号 k の人が釣った数
int id[1000000] = {0};

int main() {
  int n, q, x = 0, y = 0;
  cin >> n >> q;

  for (int i = 0; i < n; i++)
    s[0].insert(i);

  for (int i = 0; i < q; i++) {
    int a, v;
    cin >> a >> v;
    a--;
    int prev = id[a];
    int next = id[a] + v;
    x = min(x, next);
    y = max(y, next);
    s[prev].erase(a);
    s[next].insert(a);
    for (int k = y; k >= x; k--) {
      if (s[k].size()) {
        cout << ((*s[k].begin()) + 1) << " " << k << endl;
        break;
      } else {
        y = k;
      }
    }

    id[a] = next;
  }
}