線段樹;
?//?離散化的線段樹;?
?#include?<?stdio.h?>?
#include?<?algorithm?>?
#include?<?memory.h?>?
?using???namespace??std;

?const???int??MAX?=?1100000?;
?int??p[?3?*?MAX];
?int??b[MAX];
?int??c[MAX];
?int??q[?3?*?MAX];
?int??Min[MAX];
?int??Max[MAX];
?class??IntervalTree

??
{
?public?:
?????int??n;
????IntervalTree();
?????void???set?(?int??x);
?????int??InsOrDel(?int??x,?int??test);
?????int??FMAX();
?????int??FMIN();
?????int??Find(?int??x);
}?;
IntervalTree::IntervalTree()

??
{
????memset(p,?0?,?sizeof?(p));
}?
?void??IntervalTree::?set?(?int??m)

??
{
????n?=?m;

?????/**//**/?/**//*?initial?n?to?the?smallest?number;?
????????int?k=Insert(1,1);
????for(int?i=1;i<=k;i*=2)
????????p[i]=n;
?????????*/?
}?
?int??IntervalTree::InsOrDel(?int??x,?int??test)?//?test=1,add;test=0,delete;?

???
{
?????int??left?=?0?,right?=?n;
?????int??k?=?1?;
?????int??mid;
?????while?(left?<?right)

??????
{
????????mid?=?(left?+?right)?>>?1?;
?????????if?(test?>?0?)
????????????p[k]?++?;
?????????else??p[k]?--?;

?????????if?(x?<=?c[mid])??
{
????????????k?<<=?1?;
????????????right?=?mid;
????????}?

??????????else??
{
????????????k?<<=?1?;
????????????k?++?;
????????????left?=?mid?+?1?;
????????}?
????}?

??????if?(test?>?0?)??
{
????????p[k]?++?;
????????q[k]?=?x;
????}?

??????else??
{
????????p[k]?--?;
????}?
?????return??k;
}?
?int??IntervalTree::FMAX()?//?find?the?max;?

???
{
?????int??k;
????k?=?1?;

?????while?(p[?2?*?k]?>?0?||?p[?2?*?k?+?1?]?>?0?)??
{
?????????if?(p[?2?*?k?+?1?]?>?0?)k?=?2?*?k?+?1?;
?????????else??k?=?2?*?k;
????}?
?????return??q[k];
}?
?int??IntervalTree::FMIN()?//?find?the?min;?

???
{
?????int??k;
????k?=?1?;

?????while?(p[?2?*?k]?>?0?||?p[?2?*?k?+?1?]?>?0?)??
{
?????????if?(p[?2?*?k]?>?0?)k?=?2?*?k;
?????????else??k?=?2?*?k?+?1?;
????}?
?????return??q[k];
}?
?int??IntervalTree::Find(?int??t)?//?Find?the?index?of?t;?

???
{
?????int??left?=?1?,right?=?n;
?????int??mid;
?????int??k?=?1?;

?????while?(left?<?right)??
{
????????mid?=?(left?+?right)?>>?1?;

?????????if?(t?<=?p[k])??
{
????????????k?<<=?1?;
????????????right?=?mid;
????????}?

??????????else??
{
????????????t?-=?p[k];
????????????k?<<=?1?;
????????????k?++?;
????????????left?=?mid?+?1?;
????????}?
????}?
????mid?=?(left?+?right)?>>?1?;
?????if?(p[mid]?==?t)?return??mid;
?????else???return???-?1?;?//?t?isn't?in?the?tree;?
?}?
?int??main()

??
{????
????IntervalTree?a;
?????int??l,i;
?????int??max,min;
?????int??k,n;
?????int??m;

?????while?(scanf(?"?%d%d?"?,?&?n,?&?k)?!=?EOF)??
{
????????memset(p,?0?,?sizeof?(p));

?????for?(i?=?0?;i?<?n;i?++?)??
{
????????scanf(?"?%d?"?,b?+?i);
????????c[i]?=?b[i];
????}?
????sort(c,c?+?n);
?????//?離散化,相同的點合并;?

???????for?(i?=?0?,m?=?0?;i?<?n;i?++?,m?++?)??
{
?????????while?(i?<?n?-?1?&&?c[i]?==?c[i?+?1?])i?++?;
????????c[m]?=?c[i];
????}?
????a.?set?(m?-?1?);?//?initial;?
??????return???0?;
}?