Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define sc(a) scanf("%d",&a)
- #define scc(a) scanf(" %c",&a)
- #define scs(a) scanf(" %s",a)
- #define scll(a) scanf("%lld",&a)
- using namespace std;
- const int MX = 1e5+6;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair<string,int> crap;
- int n,ty[MX],Mm[MX],findN[MX];
- string codes[MX],codesforid[MX];
- char bb[33];
- string getnigger()
- {
- scanf("%s",bb);
- return (string)bb;
- }
- map<crap,int> vis;
- map<string,int> Ids;
- int getId(string& h)
- {
- if(Ids.count(h))
- return Ids[h];
- return -1;
- }
- bool deletecode(string & h)
- {
- if(!Ids.count(h))return false;
- vis.erase({h,Ids[h]});
- Ids.erase(h);
- return true;
- }
- map<pair<int,pair<int,string>>,int> index;
- int getindex(int x,int id,string& h)
- {
- if(index.count({x,{id,h}}))
- {
- return index[{x,{id,h}}];
- }
- return -1;
- }
- vector<pair<int,pair<int,string>>> hashy;
- int tree[4*MX];
- int pos,val=-1;
- void insert(int x=1,int l=0,int r=(int)hashy.size()-1)
- {
- if(l>pos||r<pos)return;
- int mid = (l+r)/2;
- if(l==r)
- {
- assert(val!=-1);
- tree[x] = val;
- return;
- }
- insert(x*2,l,mid);
- insert(x*2+1,mid+1,r);
- tree[x] = tree[x*2] + tree[x*2+1];
- }
- int K;
- int search(int x=1,int l=0,int r=(int)hashy.size()-1)
- {
- int mid = (l+r)/2;
- if(l==r)
- return r;
- if(tree[x*2]>=K)
- return search(2*x,l,mid);
- K-=tree[x*2];
- return search(2*x+1,mid+1,r);
- }
- int main()
- {
- cin>>n;
- int lastid = 0;
- for(int i=1; i<=n; i++)
- {
- scanf("%s",bb);
- string h = bb;
- if(h=="ISSUE")ty[i]=1;
- else if (h=="DELETE")ty[i]=2;
- else if (h=="RELIABILITY")ty[i] =3;
- else ty[i] = 4;
- if(ty[i]!=4)
- {
- codes[i] = getnigger();
- }
- else
- {
- int amount;
- scanf("%d",&amount);
- findN[i] =amount;
- }
- if(ty[i]==3)
- {
- int amount;
- scanf("%d",&amount);
- Mm[i] =amount;
- }
- if(ty[i]==1)
- {
- if(getId(codes[i])!=-1)
- continue;
- Ids[codes[i]]=lastid;
- vis[{codes[i],lastid}] = 0;
- hashy.push_back({0,{lastid,codes[i]}});
- lastid++;
- }
- if(ty[i]==2)
- {
- deletecode(codes[i]);
- }
- if(ty[i]==3)
- {
- int id = getId(codes[i]);
- if(id==-1)continue;
- vis[{codes[i],id}]+=Mm[i];
- hashy.push_back({-vis[{codes[i],id}],{id,codes[i]}});
- }
- }
- sort(hashy.begin(),hashy.end());
- for(int i=0;i<hashy.size();i++)
- {
- index[hashy[i]]=i;
- }
- vis.clear();
- Ids.clear();
- lastid =0;
- for(int i=1;i<=n;i++)
- {
- if(ty[i]==1)
- {
- int Id = getId(codes[i]);
- if(Id!=-1)
- {
- printf("EXISTS %d %d\n",Id,vis[{codesforid[Id],Id}]);
- continue;
- }
- else
- printf("CREATED %d 0\n",lastid);
- Ids[codes[i]]=lastid;
- codesforid[lastid]=codes[i];
- vis[ {codes[i],lastid}] = 0;
- pos = index[{0,{lastid,codesforid[lastid]}}];
- val = 1;
- insert();
- lastid++;
- }
- if(ty[i]==2)
- {
- bool exist = Ids.count(codes[i]);
- int id =-1;
- if(exist)
- id= Ids[codes[i]];
- if(exist)
- printf("OK %d %d\n",id,vis[{codesforid[id],id}]);
- else
- printf("BAD REQUEST\n");
- if(exist){
- pos = index[{-vis[{codesforid[id],id}],{id,codesforid[id]}}];
- val = 0;
- insert();
- }
- deletecode(codes[i]);
- }
- if(ty[i]==3)
- {
- int id = getId(codes[i]);
- if(id==-1){
- printf("BAD REQUEST\n");
- continue;
- }
- pos = index[{-vis[{codes[i],id}],{id,codes[i]}}];
- val = 0;
- insert();
- vis[{codes[i],id}]+=Mm[i];
- pos = index[{-vis[{codes[i],id}],{id,codes[i]}}];
- val = 1;
- insert();
- printf("OK %d %d\n",id,vis[{codes[i],id}]);
- }
- if(ty[i]==4)
- {
- if(tree[1]==0)
- {
- printf("EMPTY\n");
- continue;
- }
- int kk;
- K = min(tree[1],1+findN[i]);
- kk=K;
- int id = search();
- id = hashy[id].second.first;
- memset(bb,0,sizeof bb);
- for(int j =0;j<codesforid[id].size();j++)
- bb[j]=codesforid[id][j];
- printf("OK %s %d %d\n",bb,id,vis[{codesforid[id],id}]);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement