Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"strings"
	"fmt"
)

var scanner = bufio.NewScanner(os.Stdin)
var (
	dat = [5000][5]int{}
	m = [5]int{}
)

func main() {
	for scanner.Scan() {
		for i := range dat {
			for j := range dat[i] {
				dat[i][j] = 0
			}
		}
		for i := range m {
			m[i] = 0
		}
		n, _ := strconv.Atoi(scanner.Text())
		if n == 0 {
			break
		}
		count := 0
		for i := 0; i < n; i++ {
			scanner.Scan()
			buf := strings.Split(scanner.Text(), " ")
			d, _ := strconv.Atoi(buf[0])
			p, _ := strconv.Atoi(buf[1])
			q, _ := strconv.Atoi(buf[2])
			q--
			count += p
			if d == 2 {
				for j := 0; j < p; j++ {
					dat[m[q]][q] = 1
					ok := true
					for k := 0; k < 5; k++ {
						if dat[m[q]][k] == 0 {
							ok = false
						}
					}
					if ok {
						for k := 0; k < 5; k++ {
							dat[m[q]][k] = 0
							for l := m[q]; l < 4999; l++ {
								dat[l][k] = dat[l+1][k]
							}
							for l := 4999; l >= 0; l-- {
								if dat[l][k] != 0 {
									m[k] = l+1
									break
								}
								if l == 0 {
									m[k] = 0
								}
							}
						}
						count -= 5
					} else {
						m[q]++
					}
				}
			} else {
				h := 0
				for i := 0; i < p; i++ {
					h = max(h, m[i+q])
				}
				for i := 0; i < p; i++ {
					dat[h][i+q] = 1
				}
				for i := 0; i < p; i++ {
					m[i+q] = h+1
				}
				ok := true
				for j := 0; j < 5; j++ {
					if dat[h][j] == 0 {
						ok = false
					}
				}
				if ok {
					for j := 0; j < 5; j++ {
						dat[h][j] = 0
						for k := h; k < 4999; k++ {
							dat[k][j]=dat[k+1][j]
						}
						for k := 4999; k>= 0; k-- {
							if dat[k][j] != 0 {
								m[j]=k+1
								break
							}
							if k == 0 {
								m[j] = 0
							}
						}
					}
					count -= 5
				}
			}
		}
		fmt.Println(count)
	}
}

func max(a, b int) int {
	if a < b {
		return b
	}
	return a
}

C++: #include<iostream>
#define rep(i,n) for(int i=0;i<n;i++)
#define MH 100
using namespace std;
bool ck(int *f){
	rep(i,5)if(!f[i])return 0;
	return 1;
}
int main(){
	int n;
	while(cin>>n,n){
		int d,l,x,y,c=0;
		int field[MH][5]={0};
		rep(i,n){
			cin>>d>>l>>x,y=MH,x--,d--;
			for(;y>0;y--)rep(j,(d?1:l))if(field[y-1][x+j])goto END;
			END:
			rep(j,l)field[y+d*j][x+(1-d)*j]=1;
			rep(i,MH)while(ck(field[i])){
				rep(j,MH-i-1)rep(k,5)field[j+i][k]=field[j+i+1][k];
				rep(k,5)field[MH-1][k]=0;
			}
		}
		rep(i,MH)rep(j,5)c+=field[i][j];
		cout<<c<<endl;
	}
	return 0;
}

C++: #include <iostream>
using namespace std;

int main() {
	int i,j,n,a,b,c,d,e,f,g,m[5050];
	while(cin >> n) {
		if (n==0) break;
		for (j=0;j<5050;j++) m[j]=0; d=1;
		for (i=0;i<n;i++) {
			cin >> a >> b >> c;
			f=a >1 ? 1 << (c-1) : ((1 << b)-1)  << (c-1);  
			for (j=d;j>=0;j--) if ( m[j]+f != (m[j] | f)) break;
			e=g=j+1; 
			if (a==1) { m[e]+=f; d++;}  else for (j=0;j<b;j++) { m[e+j]+=f; d++;}
			for (j=g; j<d+5; j++) if (m[j]<31) m[e++]=m[j]; 
		}
		f=0;
		for (i=0;i<5050;i++) for (j=0;j<5;j++) f+=(m[i] & ( 1 << j))>0;
		cout << f << endl;
	}
	return 0;
}

C++: #include<bits/stdc++.h>
#define rep(i,n)for(int i=0;i<n;i++)
using namespace std;

int main() {
	int n;
	while (scanf("%d", &n), n) {
		deque<int>E[5];
		rep(i, n) {
			int d, p, q; scanf("%d%d%d", &d, &p, &q); q--;
			if (d == 1) {
				int Max = 0;
				rep(i, p)Max = max(Max, (int)E[q + i].size());
				rep(i, p) {
					int k = E[q + i].size();
					rep(j, Max - k)E[q + i].push_back(0);
					E[q + i].push_back(1);
				}
			}
			else {
				rep(i, p)E[q].push_back(1);
			}
			int Min = INT_MAX;
			rep(i, 5)Min = min(Min, (int)E[i].size());
			rep(i, Min) {
				bool ok = true;
				rep(j, 5)ok &= E[j][i];
				if(ok)rep(j, 5)E[j][i] = -1;
			}
			rep(i, 5)E[i].erase(remove(E[i].begin(), E[i].end(), -1), E[i].end());
			printf("");
		}
		int sum = 0;
		rep(i, 5)rep(j, E[i].size()) {
			if (E[i][j])sum++;
		}
		printf("%d\n", sum);
	}
}

C++: #include<iostream>
#include<cstring>
 
using namespace std;
 
const int Height = 5010;
const int Width = 5;
char field[Height][Width];
int top,ans;
int dx[] = {1,0};
int dy[] = {0,-1};
 
 
void print(int h, int w){
 
  for(int i = 0; i < h; i++){
    for(int j = 0; j < w; j++) cout << field[i][j];
    cout << endl;
  }
  cout << endl;
     
}
bool isInside(int h, int w){return 0<=h&&h<Height&&0<=w&&w<Width;}
 
int getH(int d, int len, int pos){
  for(int i = top+1; i>=0; i--){
    int h = i;
    int w = pos;
    for(int j = 0; j < len; j++){
      if(field[h][w] != '?' || !isInside(h,w)) return i+1;
      h += dy[d];
      w += dx[d];
    }
  }
}

void down(int n){
  top--;
  for(int i = n; i <= top+1; i++)
    for(int j = 0; j < Width; j++) field[i][j] = field[i+1][j];

}

void erase(){

  for(int i = 0; i <= top+1; i++){
    bool f = true;
    for(int j = 0; j < Width; j++) if(field[i][j] == '?') f = false;
    if(f){
      ans -= 5;
      down(i--);
    }
  }
}
 
void put(int d, int len, int pos){
 
  int nex = getH(d,len,pos);
  top = max(top,nex);
 
  int h = nex;
  int w = pos;
 
  for(int i = 0; i < len; i++){
    field[h][w] = '.';
    h += dy[d];
    w += dx[d];
  }
}
 
int main(){
 
  int n;
  while(cin >> n && n){
    memset(field,'?',sizeof(field));
    ans = top = 0;
    
    while(n--){
      int d, len, pos;
      cin >> d >> len >> pos;
      ans += len;
      put(d-1,len,pos-1);
      erase();
    }
    cout << ans << endl;
    print(5,5);
  }
  return 0;
}

C++: #include<bits/stdc++.h>
using namespace std;
int main(){
  int n;
  while(cin>>n,n){
    int a[5][10000]={},b[5]={},sum=0;
    while(n--){
      int q,w,e;
      cin>>q>>w>>e;e--;
      sum+=w;
      if(q==2){
        for(int i=b[e];i<b[e]+w;i++)
          a[e][i+1]=1;
        b[e]+=w;
      }
      else{
        int res=0;
        for(int i=e;i<e+w;i++)
          res=max(res,b[i]);
        for(int i=e;i<e+w;i++)
          a[i][res+1]=1;
        for(int i=e;i<e+w;i++)
          b[i]=res+1;
      }
    }
    for(int i=0;i<10000;i++){
      int pp=0;
      for(int j=0;j<5;j++)if(a[j][i])pp++;
      if(pp==5)sum-=5;
    }
    cout<<sum<<endl;
  }
}

C++: #define _USE_MATH_DEFINES
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <cfloat>
#include <ctime>
#include <cassert>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
#include <numeric>
#include <list>
#include <iomanip>
#include <iterator>
 
using namespace std;
 
typedef long long ll;
typedef pair<int,int> Pii;
typedef pair<ll,ll> Pll;
 
#define FOR(i,n) for(int i = 0; i < (n); i++)
#define sz(c) ((int)c.size())

typedef unsigned long long ull;
const int INF = (int)1e8;

bool t[5*1000][5];

int GetUnder(int x){
	for(int i = 5000-1; i >= 0; i--){
		if(t[i][x]) return i+1;
	}
	return 0;
}

int GetUnder(int d,int p,int q){
	int under = -1;
	if(d==2){
		under = GetUnder(q);
	}
	else {
		FOR(i,p){
			under = max(under,GetUnder(q+i));
		}
	}
	return under;
}

int main(){
	int n;
	while(cin>>n,n){
		memset(t,0,sizeof(t));
		FOR(i,n){
			int d,p,q; cin>>d>>p>>q;
			q--;

			int under = GetUnder(d,p,q);

			if(d==2){
				FOR(i,p) t[under+i][q] = true;
			} else {
				FOR(i,p) t[under][q+i] = true;
			}

			int c = 0;
			FOR(i,5000){
				if(accumulate(t[i],t[i]+5,0) == 5) continue;
				memcpy(t[c++],t[i],5);
			}
			for(int i = c; i < 5000; i++) FOR(j,5) t[i][j] = false;
		}
		int ans = 0;
		FOR(i,5000) FOR(j,5) ans += t[i][j];

		cout << ans << endl;
	}
	return 0;
}