چنگیزخان با ارتش عظیمش بار دیگر در فکر حمله به چین است و در پی این تصمیم به سربازانش دستور داده است که $n$ نردبان با $h$ پله پای دیوار بزرگ چین بگذارند. میدانیم سربازان چنگیز اگر روی نردبانی باشند هر ثانیه دقیقا ۱ پله بالا میروند. همچنین هر ثانیه یکی از دو اتفاق زیر رخ میدهد:
این حمله برای $q$ ثانیه اتفاق جدید دارد. بعد از آن هم چنگیز صدایش میگیرد و دستور دیگری نمیدهد. البته سربازان چینی نیز دیگر سنگی ندارند. سربازان مغولی که روی نردبانها هستند از ترس چنگیز همچنان به بالا رفتن ادامه میدهند. برای درک بیشتر سوال به مثالها توجه کنید.
در پایان، چنگیز که از حساب و کتاب بدش میآید، از شما میخواهد به او کمک کنید که بداند چند تن از سربازانش به بالای نردبانها رسیدهاند.
در خط اول به ترتیب $n$ و $q$ و $h$ میآیند که نشاندهنده تعداد نردبانها، تعداد اتفاقات و تعداد پلههای نردبانها هستند.
در ادامه $q$ خط داده می شوند که هر یک یکی از دو حالت زیر را دارند.
در تنها خط خروجی بگویید که چند سرباز چنگیز بعد از $10^{18}$ ثانیه به بالای نردبانها میرسند.
ورودی نمونه | خروجی نمونه |
---|---|
3 3 1 1 1 2 1 2 1 1 2 2 1 | 1 |
5 6 3 2 4 5 1 1 5 2 1 1 3 1 2 4 3 1 1 1 9 2 5 2 | 20 |
در ورودی نمونه اول؛
راهنمایی
اگر برای هر سنگ تعداد افرادی که آن سنگ می کشد را به دست بیاوریم، تعداد افرادی که به بالای نردبانها میرسند برابر با تعداد کل افرادی که شروع به بالا رفتن از نردبان ها کردهاند منهای مجموع تعداد افرادی است که سنگها میکشند.
راهنمایی
فرض کنید افرادی که از یک نردبان بالا میروند را به ترتیب بالا رفتن شماره گذاری کردهایم. (شخصی که زودتر از همه وارد شده با شماره ۱ شماره گذاری میکنیم و ترتیب شماره گذاری افرادی که در یک زمان شروع به بالا رفتن از نردبان میکنند را به ترتیب دلخواه تایین میکنیم.) در این صورت اگر در هر لحظه مانند $t$ شماره آخرین فردی که تا این لحظه روی نردبان $i$ کشته شده است را برابر با $last[i]$ قرار دهیم (در صورتی که کسی کشته نشده باشد $last[i]$ برابر صفر خواهد بود) آنگاه میدانیم دراین لحظه کمترین شماره بین افراد زنده روی نردبان $i$ که هنوز به بالای نردبان نرسیدهاند برابر با بیشینه مقدار $last[i]+1$ و شماره اولین فردی که بعد از لحظه $t-h$ شروع به بالا رفتن از نردبان $i$ کرده است، می باشد. فرض کنید این مقدار برابر با $mn$ باشد.
راهنمایی
فرض کنید شماره آخرین فردی که قبل از لحظه $t$ شروع به بالا رفتن از نردبان $i$ کرده باشد $mx$ باشد. آنگاه اگر در لحظه $t$ سنگی روی نردبان $i$ پرتاب شود، تعداد افرادی که این سنگ می کشد برابر با $v = min(k, mx - mn + 1)$ خواهد بود و شماره آخرین فردی که کشته می شود برابر با $mn - v + 1$ خواهد بود.
راهنمایی
برای سنگ ها به ترتیب شماره نردبان (از کوچک به بزرگ) تعداد افرادی که می کشند را حساب کنید.
راهنمایی
فرض کنید آرایه $add$ را برای هر نردبان مانند $i$ طوری تعریف کرده باشیم که اگر در لحظه $t$، تعداد $x$ نفر شروع به بالا رفتن از نردبان $i$ کنند مقدار $add[t]$ برابر با $x$ و در غیر این صورت مقدار $add[t]$ برابر با صفر باشد. آنگاه شماره اولین فردی که بعد از لحظه $t$ شروع به بالا رفتن از نردبان کرده است(در صورت وجود) برابر با ۱ واحد بیشتر از مجموع تمام $add[i]$ ها به ازای $i<t$ است. همچنین شماره آخرین فردی که قبل از لحظه $t$ شروع به بالا رفتن از نردبان کرده است برابر با مجموع $add[i]$ ها برای$i<t$ است.
راهنمایی
اگر سنگ هایی که روی نردبان $i$ انداخته می شود را به ترتیب زمان پیمایش کنیم، با کمک آرایه $add$ (که در راهنمایی ۵ تعریف شده است) میتوانیم با کمک درخت بازهای $(segment \> tree)$ تعداد افرادی که این سنگ میکشد را در $O(\log{n})$ به دست بیاوریم و مقدار $last[i]$ را بازمحاسبه کنیم.
راهنمایی
وقتی کارمان با سنگ $i$ تمام شد و قصد داشتیم آرایه $add$ را برای سنگ $i+1$ بسازیم، نیاز به ساختن آرایه از اول نیست. صرفا اندیس هایی از آرایه که در سنگ $i$ و $i+1$ متفاوت است را تغییر می دهیم. هر پرسش از نوع اول نهایتا ۲ واحد به مجموع تغییرات اضافه میکند در نتیجه مجموع تغییرات از $O(q)$ خواهد بود.