Cod sursa(job #885906)

Utilizator crushackPopescu Silviu crushack Data 22 februarie 2013 15:02:47
Problema Stergeri Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

const char IN[]="stergeri.in",OUT[]="stergeri.out";
const int mod=101,prime=13;

struct hash{
	int poz;
	int val;
};

vector<hash> H[mod];
int N,M,K;

unsigned int key(unsigned int x){
	return 1LL*x*13%mod;
}

void add(unsigned int poz){
	hash h={poz,0};
	H[key(poz)].push_back(h);
}

int get(unsigned int poz){
	int k=key(poz);
	for (int i=0;i<(int)H[k].size();++i) if (H[k][i].poz==poz)
		return H[k][i].val;
	return 0;
}

void set(unsigned int poz,int x){
	int k=key(poz);
	for (int i=0;i<(int)H[k].size();++i) if (H[k][i].poz==poz){
		H[k][i].val=x;
		return;
	}
	add(poz);
	set(poz,x);
}

void update(unsigned int poz,int st,int dr,int x,int y){
	if (x<=st && dr<=y){
		set(poz,dr-st+1);
		return;
	}
	int m=(st+dr)>>1;

	if (x<=m) update(2*poz,st,m,x,y);
	if (m< y) update(2*poz+1,m+1,dr,x,y);

	set(poz,get(2*poz)+get(2*poz+1));
}

int solve(int k){
	unsigned int poz=1;
	int st=1,dr=N,x,m;
	while (st<dr){
		m=(st+dr)>>1;
		x=m-st+1-get(2*poz);
		if (k>x)
			k-=x,st=m+1,poz=2*poz+1;
		else
			dr=m,poz=2*poz;
	}
	return st;
}

int main()
{
	int x,y,nx,ny;
	freopen(IN,"r",stdin);
	scanf("%d%d%d",&N,&M,&K);
	while (M--)
	{
		scanf("%d%d",&x,&y);
		nx=solve(x);
		ny=solve(y);
		update(1,1,N,nx,ny);
	}
	fclose(stdin);

	freopen(OUT,"w",stdout);
	printf("%d\n",solve(K));
	fclose(stdout);
	return 0;
}