Cod sursa(job #2806449)

Utilizator GligarEsterabadeyan Hadi Gligar Data 22 noiembrie 2021 17:45:48
Problema Hashuri Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <algorithm>
#include <string>

using namespace std;

ifstream fin("hashuri.in");
ofstream fout("hashuri.out");

const int nmax=1000000;

int v[nmax+1], vp[nmax+1], op[nmax+1];

bool sol[nmax+1];

struct cmp{
    bool operator()(int x, int y){
        return v[x]<v[y];
    }
};

int cautare(int x, int n, int n2){
    int sol=0;
    for(int i=n2;i>=1;i/=2){
        if(sol+i<=n&&v[vp[sol+i]]<=x){
            sol+=i;
        }
    }
    if(v[vp[sol]]==x){
        return sol;
    }else{
        return 0;
    }
}

int sp=0;
string s;
int citire(int ss){
    int m=0;
    while(s[sp]>='0'&&s[sp]<='9'&&sp<=ss){
        m=m*10+s[sp]-'0';
        sp++;
    }
    while((s[sp]<'0'||s[sp]>'9')&&sp<=ss){
        sp++;
    }
    return m;
}

int main(){
    int n;
    fin>>n;
    int n2=1;
    while(n2*2<n){
        n2*=2;
    }
    getline(fin,s,char(NULL));
    int ss=s.size();
    citire(ss);
    for(int i=1;i<=n;i++){
        op[i]=citire(ss);
        v[i]=citire(ss);
        vp[i]=i;
    }
    sort(vp+1,vp+n+1,cmp());
    for(int i=2;i<=n;i++){
        if(v[vp[i]]==v[vp[i-1]]){
            vp[i]=vp[i-1];
        }
    }
    for(int i=1;i<=n;i++){
        int a=cautare(v[i],n,n2);
        if(op[i]==1){
            sol[a]=1;
        }else if(op[i]==2){
            sol[a]=0;
        }else{
            fout<<sol[a]<<"\n";
        }
    }
    /*for(int i=1;i<=n;i++){
        fout<<op[i]<<" "<<v[i]<<"\n";
    }*/
    return 0;
}