//0:実行モード
//1:開発モード
//2:最終テストモード
const sys_debugMode : number = 0;

function chk(in_data1 : any, in_data2? : any) : void{
	if (sys_debugMode == 0 || sys_debugMode == 2){
		return;
	}
	else if (in_data2 === undefined){
		console.log(in_data1);
	}
	else{
		console.log(in_data1 + "[" + typeof(in_data2) + "] =", in_data2);
	}
}

function prt(in_data : any) : void{
	console.log(in_data);
}

class ParamManager {

	private a_s_inputLines : string[];
	private n_maxLine : number;
	private n_nowLineCnt : number;

	constructor(){
		this.a_s_inputLines = this.inputLines();
		this.n_maxLine = this.a_s_inputLines.length;
		this.descLines();
		this.n_nowLineCnt = 1;
	}
	inputLines(){
		const fs = require('fs');

		let text;
		if(sys_debugMode == 0){
			text = fs.readFileSync("/dev/stdin", 'utf8');
		}
		else{
			text = fs.readFileSync("input.txt", 'utf8');
		}

		const line:string[] = text.toString().replace(/\r/g, "").split('\n');

		return line;
	}
	descLines(){
		chk("ParamManager.a_s_inputLines", this.a_s_inputLines);
	}
	getNextLine(in_s_type?):any{
		if (this.n_nowLineCnt > this.n_maxLine){
			chk("ParamManager.getNextLine","No Next Line!");
			return;
		}
		const s_returnLine:string = this.a_s_inputLines[this.n_nowLineCnt - 1];

		this.n_nowLineCnt++;
		
		if (in_s_type == "n"){
			return parseInt(s_returnLine);
		}
		else if (in_s_type == "a"){
			return s_returnLine.split(" ");
		}
		else if (in_s_type == "an"){
			const a_s_temp = s_returnLine.split(" ");
			const a_n_temp = a_s_temp.map(function(str){return Number(str)});
			return a_n_temp;
		}
		else if(in_s_type == "s"){
			const aMoji:string[] = s_returnLine.split("");
			return aMoji;
		}
		else if(in_s_type == "sn"){
			const aMoji:string[] = s_returnLine.split("");
			const aNum:number[] = aMoji.map(function(str){return Number(str)});
			return aNum;
		}
		else{
			return s_returnLine;
		}
	}
}
const paramManager = new ParamManager();
//==================================================
//https://atcoder.jp/contests/abc167/tasks/abc167_b
//B - Easy Linear Programming
//1  が書かれたカードが  A  枚、
//0  が書かれたカードが  B  枚、
//− 1  が書かれたカードが  C  枚あります。
//これらのカードから、ちょうど  K  枚を選んで取るとき、
//取ったカードに書かれた数の和として、 ありうる値の最大値はいくつですか。
//==================================================
class Param{
	cardNumPlus1:number;
	cardNumZero:number;
	cardNumMinus1:number;
	selectNum:number;

	constructor(){
		chk("--------------------------------------------------");
		chk("パラメータ");
		//A   B   C   K
		//入力は全て整数である。
		//0 ≤ A , B , C
		//1 ≤ K ≤ A + B + C ≤ 2 × 10 9
		const aTemp = paramManager.getNextLine("an");
		this.cardNumPlus1 = aTemp[1-1];
		this.cardNumZero  = aTemp[2-1];
		this.cardNumMinus1 = aTemp[3-1];
		this.selectNum = aTemp[4-1];
		
		chk(this);
	}
}
const param = new Param();
//==================================================
class Manager{
	resultNum:number;

	constructor(){
		this.resultNum = 0;

		this.main();
	}

	main():void{
		chk("--------------------------------------------------");
		chk("main");

		this.start();
		this.resultOutput();
	}

	start():void{
		chk("--------------------------------------------------");
		chk("start");

		//ワーク変数
		let cardNumPlus1 	= param.cardNumPlus1;
		let cardNumZero 	= param.cardNumZero;
		let cardNumMinus1 	= param.cardNumMinus1;

		//合計数
		let totalNum = 0;

		//残り選択枚数
		let nokoriSelectNum = param.selectNum;

		//プラスカード
		if(cardNumPlus1 >= 1){
			//プラス1カードが選択枚数以上ある場合
			if(cardNumPlus1 >= nokoriSelectNum){
				totalNum += nokoriSelectNum;
				nokoriSelectNum = 0;
			}
			//プラス1カードが選択枚数以上ない場合
			else{
				totalNum += cardNumPlus1;
				nokoriSelectNum -= cardNumPlus1;
			}
		}

		//ゼロカード
		if(nokoriSelectNum >= 1 && cardNumZero >= 1){
			//ゼロカードが残り選択枚数以上ある場合
			if(cardNumZero >= nokoriSelectNum){
				totalNum += 0;
				nokoriSelectNum = 0;
			}
			//ゼロカードが残り選択枚数以上ない場合
			else{
				totalNum += 0;
				nokoriSelectNum -= cardNumZero;
			}
		}
		
		//マイナスカード
		if(nokoriSelectNum >= 1 && cardNumMinus1 >= 1){
			//マイナスカードが残り選択枚数以上ある場合
			if(cardNumMinus1 >= nokoriSelectNum){
				totalNum -= nokoriSelectNum;
				nokoriSelectNum = 0;
			}
		}

		//計算結果
		this.resultNum = totalNum;
	}

	resultOutput():void{
		chk("--------------------------------------------------");
		chk("resultOutput");
		//和としてありうる値の最大値を出力せよ。
		prt(this.resultNum);		
	}

}
const manager = new Manager();
//==================================================

Measured memory_bytes: 29768