شرکت «بساز و بنداز» به تازگی پروژهی رنگآمیزی دیوار بزرگ شهر را انجام دادهاست و آقای مهندس در حال جمعآوری دادههای این پروژه است تا عملکرد شرکت خود را در این پروژه بسنجد. اگر دیوار بزرگ شهر را به صورت $n$ قسمت مساوی پشتسرهم در نظر بگیریم، یک داده به صورت $t\ l\ r\ c$ به این معنی است که در زمان t، رنگ قسمتهای $l$ام تا $r$ام دیوار با رنگ $c$، رنگآمیزی میشود. در حین جمعآوری دادهها سوالهایی به این شکل برای آقای مهندس پیش میآید: «دیوار $i$ام در زمان $t$ به چه رنگی بوده است؟» دقت کنید که آقای مهندس دادهها را بر حسب زمانشان جمعآوری نمیکند. یعنی امکان دارد دادهها بر حسب زمان مرتب نباشند و آقای مهندس سوالها را با توجه به دادههایی که تا قبل از پیشآمدن این سوال جمعآوری کرده، پاسخ میدهد.
حال شما باید برنامهای بنویسید که با گرفتن دادههای مربوط به رنگآمیزی و سوالهای آقای مهندس، پاسخ سوالهای آقای مهندس را در خروجی چاپ کند.
رنگ همهی قسمتهای دیوار در ابتدای کار $0$ است. بنابراین اگر با دادههای جمعآوری شده رنگ خانهی سوال پرسیدهشده معلوم نشود، پاسخ سوال $0$ است.
سطر $i$ام خروجی پاسخ پرسش $i$ام آقای مهندس است.
| ورودی نمونه | خروجی نمونه |
|---|---|
| 4 6 ? 2 1 ~ 1 1 3 1 ? 3 1 ~ 5 2 4 2 ? 4 2 ? 6 2 | 0 1 1 2 |
راهنمایی
اگر سوال این است که «در زمان t، خانه x چه رنگی بوده؟»، باید در میان تمام رنگآمیزیهایی که خانه x را شامل میشدند و زمانشان کمتر از t بوده، آن رنگآمیزیای را پیدا کنیم که بیشترین زمان ممکن (کمتر از t) را دارد.
راهنمایی
از آنجا که باید برای هر پرسش به سرعت آخرین تغییر رنگ قبل از زمان t را پیدا کنید، نیاز به ساختاری دارید که بتواند در بین تغییرات، بزرگترین زمان ≤ t را سریع پیدا کند. برای مثال، نگهداری تغییرات در یک Set بر اساس زمان برای هر بازه یا خانه میتواند ایده خوبی باشد.
راهنمایی
اگر بخواهید برای هر رنگآمیزی تمام خانهها را بهروزرسانی کنید، زمان کافی نخواهید داشت. بهتر است از ساختارهایی استفاده کنید که به شما اجازه دهند تغییرات را روی بازهها بهصورت سریع (مثلاً در زمان لگاریتمی) اعمال و بازیابی کنید؛ مثلا Segment Tree.