Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define maxN 1000005
- #define lsb(x) ((x)&(-x))
- using namespace std;
- int aib[maxN];
- int viz[maxN];
- int n,last,x,op;
- class InParser {
- private:
- FILE *fin;
- char *buff;
- int sp;
- char read_ch() {
- ++sp;
- if (sp==4096) {
- sp=0;
- fread(buff,1,4096,fin);
- }
- return buff[sp];
- }
- public:
- InParser(const char* nume) {
- fin=fopen(nume,"r");
- buff=new char[4096]();
- sp=4095;
- }
- InParser& operator >> (int &n) {
- char c;
- while(!isdigit(c=read_ch()) && c!='-');
- int sgn=1;
- if(c=='-'){
- n=0;
- sgn=-1;
- }else
- n=c-'0';
- while(isdigit(c=read_ch()))
- n=10*n+c-'0';
- n*=sgn;
- return *this;
- }
- InParser& operator >> (long long &n) {
- char c;
- n=0;
- while (!isdigit(c=read_ch()) && c!='-');
- long long sgn=1;
- if(c=='-'){
- n=0;
- sgn=-1;
- }else
- n=c-'0';
- while(isdigit(c=read_ch()))
- n=10*n+c-'0';
- n*=sgn;
- return *this;
- }
- };
- class OutParser{
- private:
- FILE *fout;
- char *buff;
- int sp;
- void write_ch(char ch) {
- if (sp==50000){
- fwrite(buff,1,50000,fout);
- sp=0;
- buff[sp++]=ch;
- } else {
- buff[sp++]=ch;
- }
- }
- public:
- OutParser(const char* name) {
- fout=fopen(name,"w");
- buff=new char[50000]();
- sp=0;
- }
- ~OutParser() {
- fwrite(buff,1,sp,fout);
- fclose(fout);
- }
- OutParser& operator << (int vu32) {
- if (vu32<=9) {
- write_ch(vu32+'0');
- } else {
- (*this)<<(vu32/10);
- write_ch(vu32%10+'0');
- }
- return *this;
- }
- OutParser& operator << (long long vu64) {
- if (vu64<=9) {
- write_ch(vu64+'0');
- } else {
- (*this)<<(vu64/10);
- write_ch(vu64%10+'0');
- }
- return *this;
- }
- OutParser& operator << (char ch) {
- write_ch(ch);
- return *this;
- }
- OutParser& operator << (const char *ch) {
- while(*ch){
- write_ch(*ch);
- ++ch;
- }
- return *this;
- }
- };
- void update(int val)
- {
- for(int i=val;i<maxN;i+=lsb(i))
- aib[i]++;
- }
- void _delete(int val)
- {
- for(int i=val;i<maxN;i+=lsb(i))
- if(aib[i])
- aib[i]--;
- }
- int query(int pos)
- {
- int res=0;
- for(int i=pos;i>0;i-=lsb(i))
- res+=aib[i];
- return res;
- }
- int _search(int val)
- {
- int step,i;
- for(step=1;step<maxN;step<<=1);
- for(i=0;step;step>>=1)
- if(i+step<=1000000)
- if(val>=aib[i+step])
- {
- i+=step;
- val-=aib[i];
- }
- i++;
- while(!viz[i] && viz[i]<val) /* mai putine iteratii decat ma asteptam */
- i++,val-=viz[i];
- return i;
- }
- int main()
- {
- InParser f("tsm.in");
- OutParser g("tsm.out");
- f>>n;
- while(n--)
- {
- f>>op;
- if(op==1){
- f>>x;
- viz[x]++;
- if(viz[x]==1)
- update(x);
- }
- if(op==2){
- f>>x;
- last=_search(x-1);
- g<<last<<'\n';
- }
- if(op==3){
- g<<_search(0)<<'\n';
- }
- if(op==4){
- viz[last]--;
- if(viz[last]==0)
- _delete(last);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement