Nu aveti permisiuni pentru a descarca fisierul grader_test2.in
Cod sursa(job #2629822)
| Utilizator | Data | 22 iunie 2020 19:16:59 | |
|---|---|---|---|
| Problema | Nums | Scor | 90 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva de probleme | Marime | 1.39 kb |
#include <bits/stdc++.h>
#define DIM 100010
using namespace std;
string s[DIM];
int tip[DIM],w[DIM],poz[DIM],aib[DIM];
pair <pair<int,string>, int> v[DIM];
int n,k,i;
void update (int p, int val){
for (;p<=k;p+=(p&-p))
aib[p] += val;
}
int query (int p){
int sol = 0;
for (;p;p-=(p&-p))
sol += aib[p];
return sol;
}
int main (){
ifstream cin ("nums.in");
ofstream cout ("nums.out");
cin>>n;
for (i=1;i<=n;i++){
cin>>tip[i];
if (tip[i] == 0)
cin>>w[i];
else {
cin>>s[i];
v[++k] = make_pair(make_pair(s[i].length(),s[i]),i);
}
}
sort (v+1,v+k+1);
int k2 = 1;
for (i=2;i<=k;i++)
if (v[i].first.second != v[i-1].first.second)
v[++k2] = v[i];
k = k2;
for (i=1;i<=k;i++)
poz[v[i].second] = i;
for (i=1;i<=n;i++){
if (tip[i] == 0){
int val = w[i];
int st = 1, dr = k, sol = 0;
while (st <= dr){
int mid = (st+dr)>>1;
if (query(mid) >= val){
sol = mid;
dr = mid-1;
} else st = mid+1;
}
cout<<v[sol].first.second<<"\n";
} else {
if (poz[i])
update (poz[i],1);
}
}
return 0;
}
