Pagini recente » Cod sursa (job #1965315) | Cod sursa (job #2173240) | Borderou de evaluare (job #1772010) | Cod sursa (job #601999) | Cod sursa (job #397217)
Cod sursa(job #397217)
#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;
}