Cod sursa(job #2416612)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 27 aprilie 2019 19:59:15
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100005;
const int MOD=666013;
int aint[2*N+N/2];
int lazy[2*N+N/2];
inline void modd(int &x){
  x%=MOD;
}
void updlazy(int nod,int st,int dr){
  if(lazy[nod]){
    aint[nod]+=(1LL*lazy[nod]*(dr-st+1))%MOD;
    modd(aint[nod]);
    if(st!=dr){
      lazy[2*nod]+=lazy[nod];
      modd(lazy[2*nod]);
      lazy[2*nod+1]+=lazy[nod];
      modd(lazy[2*nod+1]);
    }
    lazy[nod]=0;
  }
}
void update(int nod,int st,int dr,int ust,int udr,int val){
  updlazy(nod,st,dr);
  if(st>dr || dr<ust || st>udr)
    return;
  if(st>=ust && dr<=udr){
    aint[nod]+=(1LL*val*(dr-st+1))%MOD;
    modd(aint[nod]);
    if(st!=dr){
      lazy[2*nod]+=lazy[nod];
      modd(lazy[2*nod]);
      lazy[2*nod+1]+=lazy[nod];
      modd(lazy[2*nod]);
    }
    return;
  }
  int mid=(st+dr)/2;
  update(2*nod,st,mid,ust,udr,val);
  update(2*nod+1,mid+1,dr,ust,udr,val);
  aint[nod]=aint[2*nod]+aint[2*nod+1];
  modd(aint[nod]);
}

int query(int nod,int st,int dr,int qst,int qdr){
  updlazy(nod,st,dr);
  if(st>dr || dr<qst || st>qdr)
    return 0;
  if(st>=qst && dr<=qdr)
    return aint[nod];
  int mid=(st+dr)/2;
  return (query(2*nod,st,mid,qst,qdr) + query(2*nod+1,mid+1,dr,qst,qdr))%MOD;
}

int v[N],ap[N];

struct intrebari{
  int st,dr;
  int id;
};
bool cmp(intrebari a,intrebari b){
  return a.dr<b.dr;
}
intrebari qr[N];
int sol[N];
int main()
{
    int n,k,q;
    FILE*fin,*fout;
    fin=fopen("distincte.in","r");
    fout=fopen("distincte.out","w");
    fscanf(fin,"%d%d%d",&n,&k,&q);
    for(int i=1;i<=n;i++)
      fscanf(fin,"%d",&v[i]);
    for(int i=1;i<=q;i++){
      fscanf(fin,"%d%d",&qr[i].st,&qr[i].dr);
      qr[i].id=i;
    }
    sort(qr+1,qr+q+1,cmp);
    int poz=0;
    for(int i=1;i<=q;i++){
      while(poz<qr[i].dr){
        poz++;
        update(1,1,n,poz,poz,v[poz]);
        update(1,1,n,ap[v[poz]],ap[v[poz]],-v[poz]);
        ap[v[poz]]=poz;
      }
      sol[qr[i].id]=query(1,1,n,qr[i].st,poz);
    }
    for(int i=1;i<=q;i++)
      fprintf(fout,"%d\n",sol[i]);
    return 0;

}