Cod sursa(job #397217)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 16 februarie 2010 17:45:06
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
#define NMAX 100010
int v[NMAX], t[3*NMAX], M[NMAX], P[NMAX];
int n, a, b;
void update(int p, int q,int i){
	if(p == q){
		t[i]++;
		return;
	}
	int m = (p + q)>>1;
	if(a <= m) update(p, m, 2*i);
	else update(m+1, q, 2*i+1);
	t[i] = t[2*i] + t[2*i+1];
}
void query(int p, int q, int i){
	if(p == q){
		b = p;
		return;
	}
	int m = (p + q)>>1;
	if(a <= t[2*i]) query(p, m, 2*i);
	else {
		a -= t[2*i];
		query(m+1, q, 2*i+1);
	}
}
int main(){
	freopen("nums.in", "r", stdin);
	freopen("nums.out", "w", stdout);
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i){
		int x, y;
		scanf("%d%d", &x, &y);
		M[i] = x + (y << 1);
		if(x) v[++v[0]] = y;
	}
	sort(v + 1, v + v[0] + 1);
	for(int i = 1; i <= v[0]; ++i)
		P[v[i]] = i;
	for(int i = 1; i <= n; ++i){
		if(M[i] & 1){
			a = P[M[i]>>1];
			update(1, n, 1);
		}
		else{
			a = M[i]>> 1;
			query(1, n, 1);
			printf("%d\n",v[b]);
		}
	}
	return 0;
}