Mai intai trebuie sa te autentifici.
Cod sursa(job #2987023)
Utilizator | Data | 1 martie 2023 20:53:13 | |
---|---|---|---|
Problema | Distincte | Scor | 35 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1.57 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
int x[400001], last[100001];
vector<pair<int, int> > que[100001];
int sol[100001];
struct Data{
int p, v;
}upd[100001];
void Update(int nod, int st, int dr, int p, int v)
{if(st==dr)
x[nod]+=v;
else
{int mij=(st+dr)/2;
if(mij>=p)Update(nod*2, st, mij, p, v);
else Update(nod*2+1, mij+1, dr, p, v);
x[nod]=x[nod*2]+x[nod*2+1];
}
}
int Query(int nod, int st, int dr, int qs, int qd)
{if(st>=qs && dr<=qd)
return x[nod];
else
{int mij=(st+dr)/2;
if(mij>=qd)return Query(nod*2, st, mij, qs, qd);
if(mij<qs)return Query(nod*2+1, mij+1, dr, qs, qd);
int a=Query(nod*2, st, mij, qs, qd), b=Query(nod*2+1, mij+1, dr, qs, qd);
return a+b;
}
}
int main()
{ int n, k, m, a, b;
fin>>n>>k>>m;
for(int i=1;i<=n;i++)
{fin>>a;
if(last[a]!=0)
{upd[i]={last[a], a};
last[a]=i;
}
else
{upd[i]={0, a};
last[a]=i;
}
}
for(int i=1;i<=m;i++)
{fin>>a>>b;
que[b].push_back({a, i});
}
for(int i=1;i<=n;i++)
{if(upd[i].v!=0)
{if(upd[i].p==0)Update(1, 1, n, i, upd[i].v);
else
{Update(1, 1, n, i, upd[i].v);
Update(1, 1, n, upd[i].p, -upd[i].v);
}
}
if(que[i].size()!=0)
{vector<pair<int, int> >:: iterator I;
for(I=que[i].begin();I<que[i].end();I++)
sol[I->second]+=Query(1, 1, n, I->first, i);
}
}
for(int i=1;i<=m;i++)
fout<<sol[i]<<"\n";
return 0;
}